對象存活判斷
1.引用計數(shù)(循環(huán)引用)
2.可達(dá)性分析算法
GC Roots包括棧中本地變量贯莺、類靜態(tài)屬性风喇、常量引用、native應(yīng)用
3.方法區(qū)的回收(常量缕探、類)
一個類要被回收魂莫,須滿足三個條件:
1.無類的實例存活
2.加載該類的classLoader已被回收
3.類對應(yīng)的Class對象未被引用
垃圾收集器
1.Serial/SerialOld
單線程復(fù)制,單線程標(biāo)記-整理爹耗,client模式下很好的選擇耙考。
2.ParNew
多線程進(jìn)行復(fù)制,與SerialOld潭兽、CMS組合使用
3.Parallel Scavenge
與ParNew的區(qū)別是倦始,它是“吞吐量“優(yōu)先的。
3.ParallelOld
多線程標(biāo)記-整理山卦,與Parallel Scavenge相配合
4.CMS
1.初始標(biāo)記:STW鞋邑,單線程標(biāo)記GCRoots一步之內(nèi)的對象
2.并發(fā)標(biāo)記:與用戶線程并發(fā)運(yùn)行
3.重新標(biāo)記:STW,多線程標(biāo)記并發(fā)標(biāo)記期間變動的對象
4.并發(fā)清理:與用戶線程并發(fā)并發(fā)運(yùn)行,清理
并發(fā)運(yùn)行對cpu比較敏感枚碗,可能會使用戶線程運(yùn)行緩慢逾一;清理的同時用戶進(jìn)程還在運(yùn)行,所以不能等到老年代幾乎被填滿才開始肮雨,要預(yù)留空間給用戶線程遵堵;標(biāo)記-清除會導(dǎo)致碎片頻現(xiàn),所以提供了選項來啟用整理配合酷含。
內(nèi)存分配與回收策略
1.minor GC與major GC(full GC)
2.大對象直接進(jìn)入老年代
可以設(shè)置參數(shù)對象超過多大鄙早,就使他直接存入老年代
3.長期存活對象進(jìn)入老年代
jvm為每個對象定義了age ,一個對象每經(jīng)過一次minor GC仍存活其age便加一椅亚,可以設(shè)置jvm參數(shù)一個對象age達(dá)到多大即使它進(jìn)入老年代限番。
動態(tài)對象年齡判定
相同age所有對象大小的總和超出Survivor的一半,age大于或等于該age的對象直接進(jìn)入老年代
空間分配擔(dān)保
minor GC后若eden區(qū)存活對象過大呀舔,無法放入Survivor弥虐,則會利用老年代空間擔(dān)保,老年代最大可用連續(xù)空間是否大于歷次晉升到老年代對象的平均大小媚赖,若大于進(jìn)行minor GC(有風(fēng)險)霜瘪;否則,先major GC惧磺。