JVM之垃圾收集算法

在判斷哪些對象已經(jīng)是死掉的之后,就可以開始使用垃圾回收算法進行垃圾回收內(nèi)存空間了

丟掉垃圾,省出內(nèi)存給新對象使用

當然,在這些之前,觸發(fā)的條件是某塊虛擬機內(nèi)存區(qū)域已經(jīng)裝不下新創(chuàng)建的對象了。

標記--清除算法

前提(沒有跟GC ROOT相關(guān)聯(lián)的對象并不會被立即回收,會經(jīng)歷兩次回收動作,第一次會被打上標記(對象沒有覆蓋finalize()方法,或者finalize方法已經(jīng)被虛擬機調(diào)用過),第二次會被回收)

首先標記出所有需要回收的對象,在標記完成后統(tǒng)一回收所有被標記的對象。

缺點:一是效率問題,標記和清除兩個過程的效率都不高

另一個是空間問題,標記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,內(nèi)存碎片太多可能會導(dǎo)致以后需要分配較大對象時,無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾回收動作


復(fù)制算法:

將內(nèi)存按容量劃分為大小相同的兩塊,每次只是使用其中的一塊,當這塊的內(nèi)存用完了,就將還存活著的對象復(fù)制到另一塊上去,然后再把已使用過的內(nèi)存空間一次清理掉,然后吧剩余的不回收的內(nèi)存塊,移動堆頂指針按順序分配內(nèi)存。

缺點在于每次就只用一半的內(nèi)存。

應(yīng)用場景:

新生代中98%的對象都會很快的回收掉,所以并不需要按照1:1的比例來劃分內(nèi)存空間,新生代分為eden區(qū),survivor一區(qū),survivor二區(qū),比例是8:1:1,當回收時,需要將eden區(qū)和一區(qū)的對象進行回收,然后放到二區(qū)中。如果,萬一說,回收后存活的量大于10%,那么多余的將會放到老年區(qū)。


標記--整理算法

復(fù)制算法存在大量的復(fù)制操作,而且,如果存在極端情況比如所有的對象都不需要回收,或者90%以上的對象都不需要回收,那么就需要有額外的空間來提供擔??臻g針對老年代的回收。

標記整理算法是先將需要回收的對象進行標記,把不需要回收的對象向一端移動,然后清理掉邊界以外的內(nèi)存。


分代收集算法:

對新生代的區(qū)域,使用復(fù)制算法只需要付出少量存活對象的復(fù)制成本就可以完成收集。

對于老年代的收集,因為存活率高,沒有額外的擔??臻g,就必須使用標記-清理或者標記-整理算法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容