原創(chuàng)|其它|編輯:郝浩|2009-09-24 14:40:10.000|閱讀 1437 次
概述:之前也介紹過Java內(nèi)存模型,本文主要介紹Java內(nèi)存模型中的三個代。Java的內(nèi)存模型由3個代組成,各個代的默認(rèn)排列有如本文圖中所示(適用JDK1.4.* 到 JDK6)。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
之前也介紹過Java內(nèi)存模型,下面主要介紹Java內(nèi)存模型中的三個代。Java的內(nèi)存模型由3個代組成,各個代的默認(rèn)排列有如下圖(適用JDK1.4.* 到 JDK6):
Java 的內(nèi)存模型分為
Young(年輕代)
Tenured(終身代)
Perm(永久代)
有些舊版本也叫作
New
Old
Perm
叫法不同,表達(dá)的意思卻是基本相同。
注意Young(年輕代)還可以分為Eden區(qū)和兩個Survivor區(qū)(from和to,這兩個Survivor區(qū)大小嚴(yán)格一至),新的對象實例總是首先放在Eden區(qū),Survivor區(qū)作為Eden區(qū)和 Tenure(終生代)的緩沖,可以向 Tenure(終生代)轉(zhuǎn)移活動的對象實例。
Tenure(終生代)中存放生命周期長久的實例對象,但并不是如它的名字那樣是終生的,里面的對象照樣會被回收掉。
Young和Tenure共同組成了堆內(nèi)存。
Perm(永久代)則是非堆內(nèi)存的組成部分。主要存放加載的Class類級對象如class本身,method,field等等。
有同學(xué)可能已經(jīng)注意到了,每個代都有的Virtual區(qū)又是什么?
我們知道有一些參數(shù)可以影響以上各代的大小。
在JVM啟動時,就已經(jīng)保留了固定的內(nèi)存空間給Heap內(nèi)存,這部分內(nèi)存并不一定都會被JVM使用,但是可以確定的是這部分保留的內(nèi)存不會被其他進(jìn)程使用。這部分內(nèi)存大小由 -Xmx 參數(shù)指定。
而另一部分內(nèi)存在JVM啟動時就分配給JVM,作為JVM的初始Heap內(nèi)存使用。影響這個的參數(shù)是 -Xms ,如果 -Xms 指定的值比-Xmx 的小,那么兩者的差值就是Virtual內(nèi)存值。隨著程序的運行,Eden區(qū)、 Tenured區(qū)和Perm區(qū)會逐漸使用保留的Virtual空間。
如果沒有具體指定,初始和最大堆內(nèi)存將根據(jù)機(jī)器的內(nèi)存計算得出。參數(shù)DefaultInitialRAMFraction 和 DefaultMaxRAMFraction 會影響最終的結(jié)果,如下表所示:
FormulaDefault
initial heap size memory / DefaultInitialRAMFraction memory / 64
maximum heap size MIN(memory / DefaultMaxRAMFraction, 1GB) MIN(memory / 4, 1GB)
可以看到堆內(nèi)存默認(rèn)值最大不會超過1G。
JVM會根據(jù)堆內(nèi)存的使用情況自動決定何時擴(kuò)張和縮減實際堆內(nèi)存的大小,可以用VM參數(shù) -XX:MinHeapFreeRatio= 和 -XX:MaxHeapFreeRatio= 使用堆內(nèi)存空閑百分比來定義,一般在32位機(jī)器上的默認(rèn)值如下:
ParameterDefault Value
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64m
當(dāng)空閑堆內(nèi)存所占堆內(nèi)存百分比低于40%,JVM就會試圖擴(kuò)張堆內(nèi)存空間;當(dāng)空閑堆內(nèi)存所占堆內(nèi)存百分比高于70%,JVM就會試圖壓縮堆內(nèi)存空間。
ps:以上默認(rèn)值在不同平臺會有不同的值,如果是64位系統(tǒng),這些值一般需要擴(kuò)張30%,來容納在64位系統(tǒng)下變大的對象。
加上-XX:NewRatio=3 意味著 young(年輕代) 和 tenured(終生代)的比率是1:3,也就是說,eden區(qū)和survivor區(qū)容量之和將占總堆內(nèi)存的1/4。
加上-XX:SurvivorRatio=6 設(shè)置eden區(qū)和 其中一個survivor space的比率是1:6,也就是說,其中一個survivor space占年輕代1/8的容量 (可以想想為什么不是1/7)。
另外還有 -XX:NewSize -XX:MaxNewSize 指定年輕代的初始值和最大值。
32位系統(tǒng)下默認(rèn)值如下:
Default Value
ParameterClient JVMServer JVM
NewRatio 8 2
NewSize 2228K 2228K
MaxNewSize not limited not limited
SurvivorRatio 32 32
以上就介紹了Java內(nèi)存模型的三個代。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:IT專家網(wǎng)