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