From:深入理解Java虛擬機(jī)
- 目錄
BiBi - JVM -0- 開(kāi)篇
BiBi - JVM -1- Java內(nèi)存區(qū)域
BiBi - JVM -2- 對(duì)象
BiBi - JVM -3- 垃圾收集算法
BiBi - JVM -4- HotSpot JVM
BiBi - JVM -5- 垃圾回收器
BiBi - JVM -6- 回收策略
BiBi - JVM -7- Java類(lèi)文件結(jié)構(gòu)
BiBi - JVM -8- 類(lèi)加載機(jī)制
BiBi - JVM -9- 類(lèi)加載器
BiBi - JVM -10- 虛擬機(jī)字節(jié)碼
BiBi - JVM -11- 編譯期優(yōu)化
BiBi - JVM -12- 運(yùn)行期優(yōu)化
BiBi - JVM -13- 并發(fā)
新生代GC稱(chēng)為:Minor GC
老年代GC稱(chēng)為:Major GC / Full GC
老年代GC時(shí),通常會(huì)伴隨至少一次新生代GC郑藏,但在Parallel Scavenge收集器的收集策略里就可以直進(jìn)行老年代GC按价。
-
JVM回收小例子
描述:Java堆大小為20M,不可擴(kuò)展,新生代占10M轧坎,老年代占10M股耽。其中新生代Eden占8M,Survivor1和Survivor2分別占1M褐健。生成對(duì)象a1【2M】付鹿、a2【2M】、a3【2M】、a4【4M】倘屹,當(dāng)生成a4時(shí)會(huì)執(zhí)行一次Minor GC银亲。
過(guò)程:因?yàn)榇藭r(shí)Eden + Survivor1 = 9M,a1 + a2 + a3 = 6M纽匙,剩下空間3M不夠a4使用务蝠,所以采用復(fù)制算法,將a1烛缔、a2馏段、a3復(fù)制到Survivor2中,但是Survivor2空間為1M践瓷,不足以保持任何一個(gè)對(duì)象院喜,所以通過(guò)【分配擔(dān)保機(jī)制】提前將a1、a2晕翠、a3轉(zhuǎn)移到老年代中喷舀。最后a4分配在新生代的Eden中,Survivor1和Survivor2空閑淋肾,老年代被占用6M硫麻。
-
大對(duì)象直接進(jìn)入老年代
Serial和ParNew收集器通過(guò)PretenureSizeThreshold = 1024參數(shù),可以令占用內(nèi)存大于這個(gè)設(shè)置值的對(duì)象直接在老年代分配樊卓,這樣做的目的:避免Eden和兩個(gè)Survivor之間發(fā)生大量的復(fù)制操作拿愧。
注意:Parallel Scavenge收集器沒(méi)有這個(gè)參數(shù)。
-
長(zhǎng)期存活的對(duì)象將進(jìn)入老年代
虛擬機(jī)給每個(gè)對(duì)象定義了一個(gè)對(duì)象年齡Age計(jì)數(shù)器碌尔,如果對(duì)象在Eden出生浇辜,經(jīng)過(guò)Minor GC后仍然存活,并且能被Survivor容納的話唾戚,將被移動(dòng)到另一個(gè)Survivor空間中柳洋,對(duì)象的年齡設(shè)為1。對(duì)象在Survivor區(qū)中每熬過(guò)一次Minor GC颈走,年齡就增加1膳灶,當(dāng)增加到一定程度【默認(rèn)為15歲】后晉升到老年代。
-
動(dòng)態(tài)對(duì)象年齡判斷
如果Survivor空間中【相同年齡】的所有對(duì)象內(nèi)存的總和大于Survivor空間的一半時(shí)立由,無(wú)需等待到達(dá)規(guī)定年齡轧钓,將年齡大于或等于該年齡的對(duì)象直接進(jìn)入老年代。
-
空間分配擔(dān)比衲ぃ【即老年代分配擔(dān)保的前提是:老年代能容納將要進(jìn)來(lái)的對(duì)象】
在發(fā)生Minor GC之前毕箍,虛擬機(jī)會(huì)先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對(duì)象總空間,如果成立道盏,那么Minor GC可以確定是安全的而柑。如果不成立文捶,虛擬機(jī)會(huì)查看HandlerPromotionFailure【冒險(xiǎn)策略】設(shè)置值是否允許擔(dān)保失敗。如果允許媒咳,那么會(huì)繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對(duì)象的平均大小粹排,如果大于,將嘗試一次Minor GC涩澡,盡管這次Minor GC是有風(fēng)險(xiǎn)的顽耳;如果小于,或者HandlePromotionFailure設(shè)置不允許冒險(xiǎn)妙同,那就會(huì)進(jìn)行一次Full GC射富。
風(fēng)險(xiǎn)的含義:進(jìn)行Minor GC會(huì)有多少對(duì)象會(huì)活下來(lái),在實(shí)際完成內(nèi)存回收之前是無(wú)法明確知道的粥帚,所以只好取之前每一次回收晉升到老年代對(duì)象容量的平均大小值作為經(jīng)驗(yàn)值胰耗,與老年代的剩余空間進(jìn)行比較。