問(wèn)題
新生代(Young Generation) 里為什么要分成以下內(nèi)存塊?
Eden + Survivor 0 + Survivor 1為什么這些內(nèi)存塊默認(rèn)的比例是8:1:1?
以下要說(shuō)的內(nèi)容是從《深入理解JAVA虛擬機(jī)》書(shū)中總結(jié)出來(lái)的。
新生代內(nèi)存結(jié)構(gòu)演進(jìn):
1. 單塊內(nèi)存
如果jvm 只分配單一塊內(nèi)存進(jìn)行存儲(chǔ)所有新創(chuàng)建的對(duì)象,那么JVM可以怎么樣回收內(nèi)存呢? 請(qǐng)參考以下內(nèi)存分配情況:
在回收內(nèi)存時(shí)耗跛,先把可回收的對(duì)象進(jìn)行標(biāo)記(如圖中的對(duì)象2),
然后清除這些被標(biāo)記的對(duì)象窟社。
這種過(guò)程叫【標(biāo)記-清除】算法,但有兩個(gè)缺點(diǎn):
- 標(biāo)記過(guò)程 和 清除過(guò)程的效率都不高;
- 會(huì)造成很多內(nèi)存碎片佳吞,如圖對(duì)象2被清除后夷恍,留下來(lái)的這一塊內(nèi)存就屬于內(nèi)存碎片魔眨,后續(xù)jvm應(yīng)該是不會(huì)使用,因?yàn)槿绻褂眠€得要計(jì)算這塊內(nèi)存碎片的范圍酿雪,這么一來(lái)效率就更低遏暴。
2. 分成兩塊1:1的內(nèi)存
基于第一點(diǎn)的情況,把內(nèi)存分成兩塊比例一樣的內(nèi)存指黎。每次回收內(nèi)存時(shí)朋凉,將存活的對(duì)象直接復(fù)制到另外一塊內(nèi)存中,然后清除原來(lái)內(nèi)存塊醋安。
這種過(guò)程叫【復(fù)制】算法杂彭,但也有缺點(diǎn):
- 運(yùn)行時(shí)只使用50%的內(nèi)存進(jìn)行分配對(duì)象,剩余50%的內(nèi)存空間是被浪費(fèi)的吓揪;
- 如果每次GC時(shí)只掃描第一塊內(nèi)存亲怠,那么第二塊內(nèi)存上的對(duì)象豈不是長(zhǎng)期存活而不能被釋放?所以這里缺少了一個(gè)“再次檢查是否存活”的機(jī)制柠辞。
3. 分成 8:1:1 三塊內(nèi)存
基于第2點(diǎn)团秽,實(shí)際情況下,98%的對(duì)象都是存活率為0,所以可以將運(yùn)行時(shí)的內(nèi)存(即第2點(diǎn)中的第一塊內(nèi)存)所占用的比例調(diào)整大一點(diǎn)习勤。并且增加“再次檢查對(duì)象是否存活”的機(jī)制踪栋,分配成8:1:1 三塊內(nèi)存,分別為:
eden , survivor A , survivor B
并將eden 和 survivor A 標(biāo)記成運(yùn)行時(shí)內(nèi)存,將survivor B 標(biāo)記成保留內(nèi)存(用于復(fù)制的保留內(nèi)存)图毕。
每次GC時(shí)夷都,都從將eden 與其中一塊屬于“運(yùn)行時(shí)”的內(nèi)存survivor A所存活對(duì)象復(fù)制到 另外一塊用于復(fù)制的內(nèi)存 survivorB,并標(biāo)記這些對(duì)象的age 遞增1
予颤,然后將原來(lái)內(nèi)存 eden 和 survivor A 內(nèi)存的對(duì)象全部清除囤官,
最后將survivor A 跟 survivor B(survivorB存在存活的對(duì)象) 角色交換。
那么下一次GC時(shí)荣瑟,將掃描 eden + survivor B 內(nèi)存的存活對(duì)象治拿,而survivor A內(nèi)存作為復(fù)制目標(biāo)內(nèi)存塊。
存活對(duì)象只要age 達(dá)到某一個(gè)數(shù)值(默認(rèn)jvm配置是15)則直接將該對(duì)象遷移到老年代中笆焰。這樣做的目的是為了防止其中一塊survivor被擠爆,增加了一個(gè)遷移到老年代的機(jī)制劫谅。
關(guān)于存活對(duì)象的age 設(shè)置:
-XX:MaxTenuringThreshold=15
補(bǔ)充: 在以上推算過(guò)程,是基于每次GC時(shí)存活率對(duì)象都小于survivor區(qū)也就是10%嚷掠。
但實(shí)際情況有可能GC時(shí)捏检,存活的對(duì)象大小可能比survivor 大,那么這個(gè)時(shí)候就直接復(fù)制到用于擔(dān)保機(jī)制的老年代中不皆。
以上純屬個(gè)人理解贯城,有說(shuō)不對(duì)請(qǐng)上磚。