美文网首页
常见垃圾回收器及算法简介

常见垃圾回收器及算法简介

作者: gigglesoso | 来源:发表于2020-05-17 22:56 被阅读0次
    一、GC的常见算法
    • Mark-Sweep(标记清除算法)

    该算法适合存活对象较多,可回收对象较少的场景。执行过程是需要进行两遍的扫描,第一遍定位出非垃圾对象,第二遍扫描是将垃圾对象进行清理,执行效率相对偏低,并且容易产生碎片。

    • Copying(复制算法)

    该算法适合存活对象较少的时候,将内存一分为二,每次回收都将非垃圾对象的从前一半内存拷贝的另一半内存中。整个过程只扫描一次,不会产生碎片,但是存在空间的浪费,因为只有一半的内存进行对象分配。

    • Mark-Compact(标记整理算法)

    在回收垃圾对象的时候同时进行整理的算法。同样需要进行两次扫描,第一次定位非垃圾对象,第二遍进行非垃圾对象的移动和整理。有点是不会产生碎片,内存利用率高,不像复制算法只利用了一半的内存。

    二、GC算法示意图

    红色:垃圾对象
    绿色:非垃圾对象
    白色:可用内存


    三、垃圾收集器

    垃圾收集器其实就是不同的垃圾回收算法的具体实现,针对不同的场景,不同的垃圾收集器有自己适用场景。纠正一下图中,jdk8默认的垃圾回收器是ps+po(parallel scavenge和parallel old)。


    四、垃圾收集器的发展历程

    JDK最开始时候年轻代垃圾收集器是Serial,对应老年代是Serial Old;
    因为这两者都是单线程的,所以为了收集效率,出现了使用多线程并行回收的年轻代的Parallel Scavenge和老年代的Parallel Old;后来CMS作为一个老年代收集器,几乎可以认为垃圾回收线程和用户线程是同时进行的,因此响应时间非常短,和它配套,诞生了ParNew这个年轻代的收集器,它可以认为是Parallel Scavenge的增强版。再往后就是G1垃圾收集器、ZGC垃圾回收器了。

    相关文章

      网友评论

          本文标题:常见垃圾回收器及算法简介

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