JVM進(jìn)行垃圾回收需要確定哪些是垃圾對象姻氨,有兩種確認(rèn)方法:
- 引用計數(shù)法:如果一個對象被引用夕玩,則引用計數(shù)+1坤按,反之-1泪幌,那么引用計數(shù)為0的則為垃圾對象盲厌,但是這種方式無法解決循環(huán)引用問題。
- 根可達(dá)算法:通過一系列成為GC Roots的對象作為起點(diǎn)祸泪,向下搜索吗浩。當(dāng)一個對象到任何GC Roots都沒有引用鏈相連,說明其已經(jīng)死亡没隘。
JVM的垃圾回收算法包含以下幾種:
- 復(fù)制算法:該算法主要作用在堆中的年輕代懂扼,具體過程為將不是垃圾對象從eden區(qū)+survior from區(qū)復(fù)制到survior to區(qū),所有存活對象年齡+1右蒲,然后再循環(huán)下一次復(fù)制阀湿。該算法的特點(diǎn)是效率高,適合處理大量對象成為垃圾的場景瑰妄,因為年輕代的對象都是朝生夕死矛绘,但是缺點(diǎn)就是有內(nèi)存的浪費(fèi)顺饮。
- 標(biāo)記清除算法:最基礎(chǔ)的垃圾回收算法,分為兩個階段,標(biāo)注和清除诉探。標(biāo)記階段標(biāo)記出所有需要回收的對象,清除階段回收被標(biāo)記的對象所占用的空間衍锚。該算法的缺點(diǎn)是產(chǎn)生內(nèi)存碎片韭山。
- 標(biāo)記整理算法:前一個階段和標(biāo)記清除很相似,都是標(biāo)記需要回收的對象逝撬,標(biāo)記后不是清理對象浴骂,而是將存活對象移向內(nèi)存的一端。然后清除端邊界外的對象宪潮。該方法相對標(biāo)記清除不會產(chǎn)生內(nèi)存碎片溯警,但是相對來說效率會低一些趣苏。