垃圾收集算法

作者: 暮想sun | 来源:发表于2020-01-11 20:23 被阅读0次

    标记

    如果对象在进行可达性分析之后没有发现与GC Roots相连接的引用链,被第一次标记
    执行finalize()方法,GC将在对F-Queue中的对象进行第二次标记

    1.标记-清除算法

    先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象
    1.效率问题:标记和清除两个过程的效率都不高
    2.空间问题:标记清除之后会产生大量不连续的内存碎片


    2.标记-复制算法

    将可用内存按容量分为大小相等的两块,每次只使用其中的一块。当这块的内存快使用完时,就将还存活的对象复制到另一块上,然后再把使用过的内存空间一次清理掉。


    内存分为一块较大的Eden空间和两块Survivor空间。Hotspot虚拟机默认Eden和Survivor的比例是8:1,也就是新生代容量为90%。当回收时,将Eden和Survivor中还存活的对象一次性复制到另外一个Survivor空间。如果空间不够,将这些对象直接通过分配担保机制进入老年代。

    3.标记-整理算法

    先标记所有需要回收的对象,让所有存活的对象向一端移动,然后直接清掉端边界以外的内存。


    4.分代收集算法

    根据对象存活周期的不同,Java堆分为新生代老年代
    在新生代中,每次垃圾收集时都会有大批对象死去,只有少量存活,可以选择复制算法。
    老年代中对象存活率高、没有额外空间做担保,使用“标记-清除”或“标记-整理”算法进行回收。

    相关文章

      网友评论

        本文标题:垃圾收集算法

        本文链接:https://www.haomeiwen.com/subject/nrebactx.html