垃圾回收算法有幾種類型? 他們對應的優缺點又是什么?


常見的垃圾回收算法有:

標記-清除算法、復制算法、標記-整理算法、分代收集算法

標記-清除算法

標記—清除算法包括兩個階段:“標記”和“清除”。 標記階段:確定所有要回收的對象,並做標記。 清除階段:將標記階段確定不可用的對象清除。

缺點:

標記和清除的效率都不高。
會產生大量的碎片,而導致頻繁的回收。

復制算法

內存分成大小相等的兩塊,每次使用其中一塊,當垃圾回收的時候, 把存活的對象復制到另一塊上,然后把這塊內存整個清理掉。

缺點:

需要浪費額外的內存作為復制區。
當存活率較高時,復制算法效率會下降。

標記-整理算法

標記—整理算法不是把存活對象復制到另一塊內存,而是把存活對象往內存的一端移動,然后直接回收邊界以外的內存。

缺點: 算法復雜度大,執行步驟較多

分代收集算法

目前大部分 JVM 的垃圾收集器采用的算法。根據對象存活的生命周期將內存划分為若干個不同的區域。一般情況下將堆區划分為新生代( Young Generation 和老年代( Tenured Generation ),永久代( Permanet Generation )。

老年代的特點是每次垃圾收集時只有少量對象需要被回收,而新生代的特點是每次垃圾回收時都有大量的對象需要被回收,那么就可以根據不同代的特點采取最適合的收集算法。

Young:存放新創建的對象,對象生命周期非常短,幾乎用完可以立即回收,也叫 Eden 區。

Tenured: young 區多次回收后存活下來的對象將被移到 tenured 區,也叫 old 區。

Perm:永久帶,主要存加載的類信息,生命周期長,幾乎不會被回收。

缺點: 算法復雜度大,執行步驟較多。

本文由博客群發一文多發等運營工具平台 OpenWrite 發布


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM