美文网首页
JVM那些事儿-常用的垃圾收集器(六)

JVM那些事儿-常用的垃圾收集器(六)

作者: 久伴我还是酒伴我 | 来源:发表于2022-03-28 15:13 被阅读0次

    简介

    垃圾收集算法是内存回收的理论基础,而垃圾收集器就是内存回收的具体实现。说白了,不同的垃圾回收算法是根据不同的垃圾收集器决定的。

    结构图

    截至Java15,目前存在10中垃圾收集器


    image.png

    收集器详解

    1.Serial/Serial Old 收集器

    Serial/Serial Old收集器 是最基本最古老的收集器,大概在Java1.1 及1.2时代使用,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程(STW)。
    Serial收集器是针对新生代的收集器,采用的是Copying算法.
    Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法。它的优点是实现简单高效,但是缺点是会给用户带来停顿。


    image.png

    Parallel Scavenge/Parallel Old 收集器

    Java1.8 目前默认使用该收集器,为什么不在使用Serial 及Serial Old 收集器,因为随着时代的发展,对于服务器的配置会越来越高,针对堆的空间的大小也会越来越大,收集的垃圾也会越来越多,原先的串行方式垃圾收集已经满足不了当前时代发展的需要,所以调整并行进行垃圾回收,提升垃圾回收效率。


    image.png

    ParNew/CMS 收集器

    ParNew 和 CMS 可以说是一个跨时代的组合,为什么这么说呢?CMS可以说是分代模型算法中最复杂的一个收集器,它的出现是为了解决STW过长的问题,CMS垃圾回收时STW时间会远远小于Serial Old 和Parallel Old的时间。


    image.png

    年轻代ParNew收集器采用多个GC线程实现"复制"算法(包括扫描、复制)
    年老代CMS收集器采用多线程实现"标记-清除"算法
    ★ 初始标记:标记与根集合节点直接关联的节点。时间非常短,需要STW
    ★ 并发标记:遍历之前标记到的关联节点,继续向下标记所有存活节点。时间较长(容易出现浮动垃圾)。
    ★ 重新标记:重新遍历trace并发期间修改过的引用关系对象。时间介于初始标记与并发标记之 间,通常不会很长。需要STW
    ★ 并发清理:直接清除非存活对象,清理之后,将该线程占用的CPU切换给用户线程

    缺点:使用的标记清除算法,容易出现磁盘碎片

    G1 垃圾收集器

    G1跟踪各个region里面的垃圾堆积的价值(回收后所获得的空间大小以及回收所需时间长短的经验值),在后台维护一张优先列表,每次根据允许的收集时间,优先回收价值最大的region,这种思路:在指定的时间内,扫描部分最有价值的region(而不是扫描整个堆内存),并回收,做到尽可能的在有限的时间内获取尽可能高的收集效率;
    目前为Java9 默认垃圾收集器,Java 通过调整也可以使用

    其他垃圾收集器

    ZGC目前在Java 11中使用,暂不涉及,不做过多概述。

    相关文章

      网友评论

          本文标题:JVM那些事儿-常用的垃圾收集器(六)

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