由上圖可知,java內(nèi)存主要分為6部分伴郁,分別是程序計(jì)數(shù)器,虛擬機(jī)棧焊傅,本地方法棧,堆狐胎,方法區(qū)和直接內(nèi)存,下面將逐一詳細(xì)描述鸭栖。
1顽爹、程序計(jì)數(shù)器
線程私有,即每個(gè)線程都會有一個(gè)镜粤,線程之間互不影響,獨(dú)立存儲肉渴。
代表著當(dāng)前線程所執(zhí)行字節(jié)碼的行號指示器公荧。2同规、虛擬機(jī)棧
線程私有,它的生命周期和線程相同券勺。
描述的是java方法執(zhí)行的內(nèi)存模型:每個(gè)方法在執(zhí)行的同時(shí)多會創(chuàng)建一個(gè)棧幀用于存儲局部變量表、操作數(shù)棧关炼、動態(tài)鏈表程腹、方法出口等信息儒拂。
每一個(gè)方法從調(diào)用直至完成的過程色鸳,就對應(yīng)著一個(gè)棧幀在虛擬機(jī)中入棧到出棧的過程。
局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類型和對象引用见转,所需內(nèi)存空間在編譯期確定命雀。
-Xoss參數(shù)設(shè)置本地方法棧大小(對于HotSpot無效)
-Xss參數(shù)設(shè)置棧容量 例:?-Xss128k
3斩箫、本地方法棧
同虛擬機(jī)棧吏砂,只不過本地方法棧位虛擬機(jī)使用到的native方法服務(wù)。
Sun HotSpot虛擬機(jī)把本地方法棧和虛擬機(jī)棧合二為一乘客。
4赊抖、java堆
線程共享
主要用于分配對象實(shí)例和數(shù)組。
-Xms參數(shù)設(shè)置最小值
-Xmx參數(shù)設(shè)置最大值 例:VM Args:?-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
若-Xms=-Xmx,則可避免堆自動擴(kuò)展寨典。
-XX:+HeapDumpOnOutOfMemoryError可以讓虛擬機(jī)在出現(xiàn)內(nèi)存溢出是dump出當(dāng)前的內(nèi)存堆轉(zhuǎn)儲快照。
5房匆、方法區(qū)
線程共享
用于存儲已被虛擬機(jī)加載的類信息耸成、常量、靜態(tài)變量浴鸿、即使編譯后的代碼等數(shù)據(jù)井氢。
別名永久代(Permanent Generation)
-XX:MaxPermSize設(shè)置上限
-XX:PermSize設(shè)置最小值 例:VM Args:-XX:PermSize=10M -XX:MaxPermSize=10M
運(yùn)行時(shí)常量池(Runtime Constant Pool)是方法區(qū)的一部分。
Class文件中除了有類的版本岳链、字段花竞、方法、接口等信息外掸哑,還有一項(xiàng)是常量池(Constant Pool Table),用于存放編譯期生成的各種字面量和符號引用约急,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中存放。
運(yùn)行時(shí)常量池相對于Class文件常量池的一個(gè)重要特征是具備動態(tài)性:即除了Class文件中常量池的內(nèi)容能被放到運(yùn)行時(shí)常量池外苗分,運(yùn)行期間也可能將新的常量放入池中厌蔽,比如String類的intern()方法。
6摔癣、直接內(nèi)存
直接內(nèi)存并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分奴饮。
在NIO中,引入了一種基于通道和緩沖區(qū)的I/O方式择浊,它可以使用native函數(shù)直接分配堆外內(nèi)存戴卜,然后通過一個(gè)存儲在java堆中的DirectByteBuffer對象作為這塊內(nèi)存的引用進(jìn)行操作。
-XX:MaxDirectMemorySize設(shè)置最大值琢岩,默認(rèn)與java堆最大值一樣投剥。
例:-XX:MaxDirectMemorySize=10M -Xmx20M
對于32位操作系統(tǒng)來說,系統(tǒng)最大內(nèi)存為4G粘捎。
系統(tǒng)給每個(gè)進(jìn)程的內(nèi)存是有限制的薇缅,譬如32位的windows 限制為2G
作者??chaofanwei
轉(zhuǎn)載自:?https://blog.csdn.net/chaofanwei/article/details/19418753