【JVM】9.自动垃圾回收(垃圾回收器)

发布时间:2023年12月18日

5.9 垃圾回收器

现在先学一下垃圾回收器的种类以及如何使用垃圾回收器。之后实战篇的时候再学习垃圾回收器的原理。

垃圾回收器是垃圾回收算法的具体实现。

HotSpot之中垃圾回收器分为年轻代和老年代,年轻代和老年代有着不同的垃圾回收算法实现,除了最特殊的G1垃圾回收器以外,其他垃圾回收器都必须两两配对使用(年轻代和老年代)。

在这里插入图片描述

(1)年轻代垃圾回收器

  • Serial垃圾回收器

与老年代中的SerialOld回收器搭配使用。

在这里插入图片描述

  • ParNew垃圾回收器

与老年代的CMS回收器搭配使用。

在这里插入图片描述

  • Parallel Scavenge垃圾回收器

    这个回收器可以保证系统的吞吐量(吞吐量指用户线程执行时间占总执行时间的比例。比如吞吐量99,说明用户执行时间占99%,垃圾回收的时间占1%)。吞吐量过大,无法保证垃圾被及时清理,等到垃圾积累了一定数量后,再来清理会使得STW暂停时间过长。

    它的老年代搭配是Parallel Old垃圾回收器。这个垃圾回收器还是JDK8默认的垃圾回收器。

在这里插入图片描述

? 不过PS垃圾回收器这个GC比较有意思,它还提供了一个参数可以设置最大的STW时间。

在这里插入图片描述

? 最大暂停时间和吞吐量是矛盾的。想要小的最大暂停时间,吞吐量就不可能大;想要大的吞吐量,最大暂停时间就不可能小(上边分析过了)。如果同时设置了最大暂停时间和吞吐量,需要多做测试,尽量把这两个值调整到最合适的状态。

? 值得注意的是,减小最大暂停时间是通过减小堆内存来实现的。垃圾回收器会根据最大暂停时间动态调整堆的大小。

(2)老年代垃圾回收器

  • Serial Old垃圾回收器

    与年轻代的Serial垃圾回收器搭配使用。

在这里插入图片描述

  • CMS垃圾回收器

    与年轻代的ParNew回收器搭配使用。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • Parallel Old垃圾回收器

    这个垃圾回收器的年轻代搭配是Parallel Scavenge垃圾回收器。与它的年轻代搭档一样,它的暂停时间也比较长。

在这里插入图片描述

(3)G1垃圾回收器

jdk9之后默认的垃圾回收器是G1(Garbage First)垃圾回收器。

G1垃圾回收器可以说整合了jdk8之前的垃圾回收器的优点,jdk9之后强烈推荐使用G1垃圾回收器。

在这里插入图片描述

G1之外的垃圾回收器,内存一般都是连续的。

在这里插入图片描述

G1的内存结构不再是连续的了。

在这里插入图片描述

G1垃圾回收有两种方式:

  • 年轻代回收(Young GC)

    回收Eden区和Survivor区垃圾对象。通过参数-XX:MaxGCPauseMills=n(n默认是200)设置每次垃圾回收时的最大暂停时间毫秒数。G1垃圾回收器会尽可能保证暂停时间。

    执行流程:

    1. 新创建对象会存放在Eden区,当G1判断年轻代区不足(Eden区和Survivor区占了总堆的60%),会执行Young GC。
    2. 执行Young GC,首先标记Eden和Survivor中哪些对象是存活的。然后,根据配置的最大暂停时间选择某些区域Z,将Z中所有存活对象复制到一个新的Survivor区中(年龄+1),然后清空Z中的所有垃圾对象。
    3. 1到2如此循环直到某些对象的年龄达到阈值(默认15),将会晋升老年代。

    G1在Young GC时,会记录每个Region的平均耗时,作为下次回收的参考依据。比如,最大暂停时间设置成100ms,每个Region回收耗时30ms,下次就只能回收3个Region了。

    某些对象如果过大(大小超过Region的一半),不会放入年轻代中,而是放入老年代中的Humongous区(Humongous:巨大的)。如果对象大小超过一个Region的大小,它有可能会横跨多个Region。

    之所以不会产生内存碎片是因为回收时会将多个Region中的存活对象复制到新的Region区中,然后将没用的Region一口气清空。

  • 混合回收(Mixed GC)

    经过Young GC多次回收,有很多对象晋升老年代。如果年轻代和老年代空间不够用了(或者说总堆占有率超过参数-XX:InitiatingHeapOccupancyPercent(默认45%)),就会触发混合回收Mixed GC,回收年轻代中所有Region的垃圾对象和老年代中部分Region的垃圾对象以及老年代中Humongous区中的所有对象。采用复制算法来完成。复制算法保证了老年代中也不会出现内存碎片。

在这里插入图片描述

值得注意的是:Young GC和Mixed GC中发现没有足够的空Region可以存放存活的对象,会出现Full GC(单线程执行标记-整理算法清理掉非存活对象,获取空的Region)。Full GC耗费的时间会比较久,所以尽量让堆中有空余的内存。

在这里插入图片描述

在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_52808620/article/details/134937375
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。