鍍金池/ 問答/Java  Linux  網(wǎng)絡(luò)安全  HTML/ JAVA中的GC與內(nèi)存分配策略

JAVA中的GC與內(nèi)存分配策略

JAVA中大多數(shù)情況下,對(duì)象默認(rèn)在Eden中分配,在觸發(fā)GC時(shí)如果survivor空間不足就會(huì)放到老年代里面去。
假設(shè)如下情景:
eden:80M survivor1:10M survivor2:10M
現(xiàn)在survivor2是空的,然后在eden中總計(jì)6M的對(duì)象存活,在survivor1中有總計(jì)5M的對(duì)象存活,那么我們有總共11M的東西存活,survivor2只有10M的空間大小,因此是無(wú)法都復(fù)制到survivor2中去的,就需要老年代,問題是有多少東西要復(fù)制到老年代中去,是全部11M的東西都復(fù)制進(jìn)去,還是說在survivor2中存滿10M(假設(shè)對(duì)象組合可以剛好分為10M和1M),然后剩下1M的東西存放到老年代中去。是有什么算法嗎?還有,如果在eden中的6M就是一個(gè)對(duì)象(也就是一個(gè)對(duì)象就6M,沒有其他對(duì)象),在survivor1中一個(gè)對(duì)象就5M,那么又有哪些對(duì)象是要復(fù)制到survivor2中,哪些復(fù)制到老年代中呢??是按最大的6M存放嗎??

回答
編輯回答
礙你眼

看了一下深入了解JAVA虛擬機(jī)。這個(gè)時(shí)候會(huì)執(zhí)行空間分配擔(dān)保策略。他的原話是這么說的:把survivor無(wú)法容納的對(duì)象直接進(jìn)入老年代。所以應(yīng)該是存滿survivor2.然后把剩下的1M存入老年代。

括號(hào)內(nèi)是擴(kuò)展,你可以跳過(順便多說幾句。在minorgc時(shí)。jvm都會(huì)檢查老年代剩余空間是否大于本次gc存活的對(duì)象大小。例如上面剩下的1M對(duì)象。老年代空間不足一兆。那么檢查虛擬機(jī)是否允許承擔(dān)風(fēng)險(xiǎn)(HandlePromotionFailure參數(shù))。如果允許。還會(huì)檢查過去幾次晉升到老年代的平均大小是否小于目前老年代最大連續(xù)可用空間。如果小于。將嘗試minorgc 。否則直接進(jìn)行fullgc。)

還有你說的第二種情況。會(huì)執(zhí)行jvm的大對(duì)象直接進(jìn)入老年代策略(前提是-xx:PretenureSizeThreashold參數(shù)的值是大于5M的)。如果老年代無(wú)法容納這兩個(gè)對(duì)象。就會(huì)進(jìn)行fullgc。如果fullgc后還不行。再進(jìn)行fullgc

2017年4月11日 02:18