概述
本文主要是介紹幾種垃圾收集算法的基本思路,包括標(biāo)記-清除算法丈屹、復(fù)制算法、標(biāo)記整理算法伶棒、分代收集
標(biāo)記-清除算法
基本思路
分為“標(biāo)記”和“清除”兩個步驟旺垒,先標(biāo)記所有需要回收的對象,再統(tǒng)一進行清除被標(biāo)記的對象肤无。
評價
- 效率低先蒋,無論是標(biāo)記過程還是清除過程。
- 標(biāo)記后直接清除宛渐,沒有對內(nèi)存空間進行整理竞漾,會產(chǎn)生大量不連續(xù)的內(nèi)存碎片。當(dāng)程序運行需要分配較大對象時窥翩,會由于沒有足夠的連續(xù)內(nèi)存而提前觸發(fā)一次GC业岁。
復(fù)制算法
基本思路
將內(nèi)存分為兩塊大小相等的區(qū)域,每次只使用其中的一塊來分配內(nèi)存寇蚊,當(dāng)其中一塊內(nèi)存空間用完了笔时,觸發(fā)GC時,將仍然存活的對象復(fù)制到另一塊內(nèi)存上仗岸,再將使用過的內(nèi)存一次性清理掉允耿。
實際使用
現(xiàn)在的商業(yè)虛擬機都采用復(fù)制算法來回收新生代,由于新生代的對象存活率很低扒怖,所以將內(nèi)存空間劃分為Eden區(qū)和兩個Survivor區(qū)较锡,每次分配內(nèi)存都在Eden區(qū)和其中一個Survivor區(qū)進行。當(dāng)發(fā)生垃圾回收時盗痒,將Eden和Survivor區(qū)中存活的對象復(fù)制到另一個Survivor區(qū)蚂蕴,然后直接清空剛才兩個區(qū)。
hotspot虛擬機提供的Eden和Survivor空間的默認比例為8:1,即最多只會浪費10%的內(nèi)存空間掂墓。一般來說谦纱,新生代對象死亡率達到98%,但是不能保證特殊情況君编。所以跨嘉,如果另外一塊Survivor空間沒有足夠空間存放上一次新生代收集下來的存活對象時,對象將通過分配擔(dān)保機制進入老年代吃嘿。
評價
- 復(fù)制算法不會產(chǎn)生內(nèi)存碎片祠乃,保證內(nèi)存空間規(guī)整。
- 如果使用兩塊大小相等的內(nèi)存區(qū)域來做復(fù)制算法兑燥,內(nèi)存的資源利用率太小亮瓷,代價太大。商業(yè)虛擬機的內(nèi)存劃分將內(nèi)存利用率提升至90%,解決了內(nèi)存使用率的問題降瞳。
- 當(dāng)對象存活率高時嘱支,復(fù)制操作的過程就會變得很頻繁,效率較低挣饥。并且由于需要劃分內(nèi)存除师,所以需要額外的空間來做分配擔(dān)保,防止空間不足的極端情況扔枫。所以復(fù)制算法適用新生代垃圾回收汛聚,而不適用于老年代。
標(biāo)記-整理算法
基本思路
標(biāo)記過程與“標(biāo)記-清除”算法相同短荐,然后讓所有的存活對象朝著一端進行移動倚舀,之后直接將存活對象之外的內(nèi)存空間進行清理。
評價
- 當(dāng)對象過多時忍宋,標(biāo)記和整理兩個過程效率低
- 不產(chǎn)生內(nèi)存碎片痕貌,保證內(nèi)存空間規(guī)整,方便分配內(nèi)存
- 適用于老年代垃圾回收
分代收集算法
分代收集算法不算一種回收算法糠排,類似于多種算法的綜合使用芯侥。分代收集算法的思路主要是:按照對象存活時間,將內(nèi)存劃分為不同的區(qū)域乳讥,一般來說柱查,將java堆劃分為新生代和老年代,這樣可以根據(jù)不同區(qū)域的對象的特點來采用最適當(dāng)?shù)氖占惴ㄔ剖@缧律鷮ο笏劳雎矢甙ぃ瑒t采用復(fù)制算法;老年代對象存活率高汹忠,并且沒有多余內(nèi)存空間做分配擔(dān)保淋硝,則采用“標(biāo)記-清除”或“標(biāo)記-整理”進行算法收集雹熬。