1. young GC 和 full GC
- young gc:回收年輕代垃圾,回收頻繁握巢,速度較快
- full gc:回收老年代+年輕代,速度比young gc慢約10倍
2.JVM內(nèi)存分配與回收
2.1 對象分配時優(yōu)先進(jìn)入Eden
2.2 大對象直接進(jìn)入老年代
- 通過設(shè)置JVM參數(shù) -XX:PretenureSizeThreshold,當(dāng)對象大于該值時剩辟,直接放入老年代
2.3 長期存活對象進(jìn)入老年代
- 默認(rèn)經(jīng)過15次young gc
2.4 對象動態(tài)年齡判斷
+survivor區(qū)中,一批對象占據(jù)的大小大于survivor區(qū)的50%時往扔,大于這批對象最大年齡的對象都放入老年代(一般在young gc之后執(zhí)行)
2.5 young gc之后贩猎,存活的對象survivor區(qū)域放不下,這些對象也會直接放入老年代
2.6 老年代空間分配擔(dān)保機制
在young gc之前萍膛,進(jìn)行判斷
(1)如果老年代的剩余大小>=年輕代所有對象的大小之和吭服,則觸發(fā)young gc;否則執(zhí)行步驟2
(2)如果沒有設(shè)置擔(dān)保參數(shù) -XX:HandlePromotionFailure(jdk8之后默認(rèn)設(shè)置了該值)蝗罗,則執(zhí)行full gc艇棕;否則執(zhí)行步驟3
(3)判斷老年代的可用空間是否大于之前每次young gc之和進(jìn)入老年代對象的平均值大小,如果剩余空間較大串塑,則執(zhí)行young gc沼琉,否則執(zhí)行full gc
3.如何判斷對象是否可被回收
- 引用計數(shù)法:對象每被引用一次,次數(shù)+1桩匪,引用失效打瘪,次數(shù)-1;引用為0吸祟,對象即為可被回收對象
優(yōu)點:實現(xiàn)簡單瑟慈,效率高
缺點:可能出現(xiàn)循環(huán)引用
- 可達(dá)性分析:通過一系列GC ROOTs節(jié)點作為七點,開始搜索屋匕,可以到達(dá)的節(jié)點標(biāo)記為非垃圾對象葛碧,不可到達(dá)的節(jié)點就是垃圾對象
可以作為GC Roots的節(jié)點:線程棧中的本地變量,靜態(tài)變量过吻,本地方法棧中的變量
-
finalize()方法最終判斷是否存活
即使對象在可達(dá)性分析中被標(biāo)記為垃圾對象进泼,也不是立馬被清除的,只有當(dāng)再被標(biāo)記時纤虽,才會被清除乳绕。就如同被判了“死刑”,也不是“非死不可”的逼纸。在finalize()方法中洋措,他們還有最后一次不被清除的機會- 對在可達(dá)性分析中,沒有與GC Root相連的對象杰刽,進(jìn)行第一次標(biāo)記菠发,并進(jìn)行一次篩選王滤;篩選的條件是:對象必須要重寫finalize()方法,如果沒有重寫滓鸠,則直接回收
- 對有重寫finalize()方法的對象雁乡,在回收之前,先執(zhí)行該方法糜俗,如果在方法中踱稍,該對象重新與引用鏈上的變量產(chǎn)生聯(lián)系(比如賦值給某個類變量或者成員對象的變量),那么這個對象在第二次標(biāo)記時悠抹,就不會被刪除
如何判斷一個類是無用的類
(1) 所有該類的實例均被回收珠月,即不會再有對象的對象頭指向該類的類元數(shù)據(jù)
(2)該類的類加載器被回收了
(3)該類對于的java.lang.Class對象沒有在任何地方被引用,即無法再通過反射訪問該對象屬性
4.垃圾回收算法
-
標(biāo)記-清除法:分為標(biāo)記和清除連個階段
- 優(yōu)點:算法簡單
- 缺點:
(1)效率低锌钮,需要遞歸與全堆對象遍
(2)回收之后的空間離散不連續(xù)
-
復(fù)制算法:將內(nèi)存大小分為兩塊桥温,每次只用其中一塊引矩,當(dāng)對使用的一塊進(jìn)行回收時梁丘,將存活的對象復(fù)制到另一塊去
- 優(yōu)點:空間連續(xù)
- 缺點:空間使用率低,每次只能使用一半的空間
標(biāo)記-整理算法:先執(zhí)行標(biāo)記旺韭,然后將存活對象向前移動氛谜,最好釋放端邊界以外的空間
-
分代回收算法:對年輕代和老年代采用不同的算法進(jìn)行回收
- 對于年輕代:90%的對象都是“朝生夕死”,只有很少的對象存活区端,可以采用復(fù)制算法
- 對于老年代:對象存活幾率比較高值漫,可以采用“標(biāo)記-清除”或是“標(biāo)記-整理”算法,這兩種算法一般比復(fù)制算法慢10倍以上
5.垃圾收集器
所謂垃圾收集器织盼,其實就是垃圾搜集算法的具體實現(xiàn)杨何。沒有一個一勞永逸的垃圾搜集器,每種垃圾收集器都有其使用場景
-
Serial收集器:串行收集器
在垃圾搜集期間沥邻,只有一個線程去執(zhí)行垃圾搜集工作危虱,此時,其他所有線程都是停止工作(STW)
Serial收集器.png- 有點:單線程簡單且高效唐全,沒有線程切換
- 缺點:所有線程STW
-
ParNews收集器:Serial的多線程版本埃跷,線程數(shù)一般與CPU核心數(shù)相等
ParNews收集器.png