常見的垃圾回收算法有:
標記-清除算法、復制算法、標記-整理算法、分代收集算法
標記-清除算法
標記—清除算法包括兩個階段:“標記”和“清除”。 標記階段:確定所有要回收的對象,並做標記。 清除階段:將標記階段確定不可用的對象清除。
缺點:
標記和清除的效率都不高。
會產生大量的碎片,而導致頻繁的回收。
復制算法
內存分成大小相等的兩塊,每次使用其中一塊,當垃圾回收的時候, 把存活的對象復制到另一塊上,然后把這塊內存整個清理掉。
缺點:
需要浪費額外的內存作為復制區。
當存活率較高時,復制算法效率會下降。
標記-整理算法
標記—整理算法不是把存活對象復制到另一塊內存,而是把存活對象往內存的一端移動,然后直接回收邊界以外的內存。
缺點: 算法復雜度大,執行步驟較多
分代收集算法
目前大部分 JVM 的垃圾收集器采用的算法。根據對象存活的生命周期將內存划分為若干個不同的區域。一般情況下將堆區划分為新生代( Young Generation 和老年代( Tenured Generation ),永久代( Permanet Generation )。
老年代的特點是每次垃圾收集時只有少量對象需要被回收,而新生代的特點是每次垃圾回收時都有大量的對象需要被回收,那么就可以根據不同代的特點采取最適合的收集算法。
Young:存放新創建的對象,對象生命周期非常短,幾乎用完可以立即回收,也叫 Eden 區。
Tenured: young 區多次回收后存活下來的對象將被移到 tenured 區,也叫 old 區。
Perm:永久帶,主要存加載的類信息,生命周期長,幾乎不會被回收。
缺點: 算法復雜度大,執行步驟較多。
本文由博客群發一文多發等運營工具平台 OpenWrite 發布