對(duì)象是否存活的算法:
- 引用計(jì)數(shù)法:無法解決循環(huán)引用的問題。
- 可達(dá)性分析法:GCRoots 可達(dá)。
GCRoots對(duì)象:
虛擬機(jī)棧中的引用對(duì)象
方法去靜態(tài)變量
方法區(qū)中的常量
本地方法(JNI)棧中的引用對(duì)象
垃圾回收算法:
- 標(biāo)記清理:根據(jù)可達(dá)性分析,標(biāo)記不再引用的對(duì)象(標(biāo)記過程會(huì)stop the world),然后再進(jìn)行清除操作??臻g碎片的問題。
- 復(fù)制算法:一般用于年輕代,數(shù)據(jù)較小的區(qū)域。存活率較高時(shí),需要進(jìn)行較多的復(fù)制操作;還有空間浪費(fèi)等問題。
- 標(biāo)記整理:標(biāo)記,然后整理對(duì)齊,處理空間碎片的問題,存活對(duì)象都移動(dòng)向一端,然后直接清理掉端邊界意外的內(nèi)存。
- 分代手機(jī)算法:年輕代使用復(fù)制算法;老年代使用標(biāo)記清理或標(biāo)記整理
堆的分代
- 年輕代:年輕代又分為一個(gè) Eden區(qū)和兩個(gè)Survivor區(qū)
- 老年代
垃圾回收的整個(gè)過程:
- 如果設(shè)置了 -XX:MaxTenuringThreshold, 會(huì)先判斷對(duì)象是否大于該值,大于就直接放到老年代。
- 看 Eden 區(qū)是否能放下,能放下直接放Eden區(qū);
- Eden 區(qū)放不下會(huì)觸發(fā)一 YoungGC(MinorGC),存活的對(duì)象會(huì)被放到 survivor 的 to 區(qū),對(duì)象頭中的 age 加 1,MinorGC還同時(shí)會(huì)對(duì) from 區(qū)的對(duì)象進(jìn)行標(biāo)記,存活對(duì)象 age 等于 15 的會(huì)被移動(dòng)到老年代,存活且年齡小于15的會(huì)被放到 to 區(qū),age加 1;此時(shí) from 區(qū)所有對(duì)象都被轉(zhuǎn)移,清空 from 區(qū),然后 from 和 to 區(qū)域互換。
- 對(duì)象放到老年代,若空間不足會(huì)觸發(fā) FullGC
- 分配擔(dān)保,在進(jìn)行 MinorGC 前會(huì)先比較當(dāng)前年輕代對(duì)象總大小是否小于當(dāng)前老年代最大可用連續(xù)空間大小,若小于會(huì)認(rèn)為此次 MinorGC 為安全的;若大于,會(huì)認(rèn)為 MinorGC 有一定風(fēng)險(xiǎn),此時(shí)會(huì)比較老年代最大可用連續(xù)空間是否大于歷次晉升到老年代對(duì)象的平均大小,若大于,會(huì)嘗試進(jìn)行一次 MinorGC,若小于改為進(jìn)行一次 FullGC。