垃圾回收器

本文深入解析常见垃圾回收器,包括串行、并行、CMS及G1垃圾收集器的工作原理与特性。涵盖不同回收器的优缺点、执行流程、参数配置及G1收集器的特殊机制,如Humongous区域、Remembered Set及Mixed GC。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见垃圾回收器

串行垃圾收集器(Serial Garbage Collector)、并行垃圾收集器(Parallel Garbage Collector)、CMS(并发)垃圾收集器(CMS Garbage Collector)、G1垃圾收集器(G1 Garbage Collector)

1.1 串行垃圾收集器

**使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,并且java应用中所有的线程都要暂停,等待垃圾回收的完成,这种现象称之为STW(Stop the World) **

  • 对于交互性较强的javaweb应用中是不会采用该收集器的。
  • 通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。
1.2 编写测试类

在这里插入图片描述

1.2.1设置垃圾回收为串行收集器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1 并行垃圾收集器

在串行垃圾收集器的基础上进行改进,将单线程改为多线程,这样可以缩短垃圾回收的时间(并行能力较强的机器)

  • 收集过程中也会暂停应用程序。
2.1.1 ParNew垃圾收集器

工作在年轻代上的,只是将串行的垃圾收集器改为了并行。

  • 通过-XX:+UseParNewGC参数设置年轻代使用ParNew回收器,老年代依然是串行收集器。
    测试:在这里插入图片描述
    在这里插入图片描述
2.1.2 ParallelGC垃圾收集器

ParallelGC收集器在ParNewGC基础上新增两个和系统吞吐量相关的参数,使其用起来更加灵活高效。
在这里插入图片描述

3.1 CMS垃圾收集器

CMS全称Concurrent Mark Sweep,是一款并发的、使用标记清除算法的垃圾回收器,该回收器是针对老年区的垃圾回收器;通过参数-XX:+UseConcurrentMarkSweepGC进行设置

3.1.1执行流程

在这里插入图片描述

3.1.2测试

在这里插入图片描述

4.1 G1垃圾收集器

G1垃圾收集器是在JDK1.7中正式使用的全新的垃圾收集器;

G1 的三步骤:
  • 第一步:开启G1垃圾收集器
  • 第二步:设置堆的最大内存
  • 第三步:设置最大的停顿时间
    **G1 中提供了三种模式的垃圾回收模式:YoungGC、MixedGC、FullGC;在不同的条件下被触发。 **
4.1.1原理

G1相比其他收集器而言最大的区别在于它取消了年轻代、年老代的物理划分,取而代之的是将堆划分为若干个区域(Region),这些区域中包含了有逻辑上的年轻代和年老代区域。所以我们再也不用单独得对每个空间进行设置了,不用担心每个代内存是否足够。
示意图:

在这里插入图片描述
在G1划分的区域中,年轻代的垃圾收集器依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间,G1收集器通过将对象从一个区域复制到另一个区域,完成了清理工作。
在正常的处理过程中,G1完成了堆的压缩,这样也就不会有CMS内存碎片的问题的存在了。
在G1中,有一种特殊的区域,叫Humongous区域。
* 如果一个对象占用的空间 超过了分区的50%以上,G1收集器就会认为这是一个矩形对象。
* 这些巨型对象,默认直接会被分配在老年代,但是如果他是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。
* 为了决绝这个问题,G1划分了一个Humongous区,它专门存放巨型对象。如果一个H区装不下一个对象,那么G1会寻找连续的H分区来储存。为了能找到连续的H区,有时候不得不启动FullGC。

4.2 YoungGC

YoungGC主要是对Eden区进行GC,它在Eden空间耗尽时被触发。

*Eden空间的数据移动到Survivor空间中,如果Survivor空间不够,Eden空间的部分数据会直接晋升到年老区空间。
*最终Eden空间数据为空,GC停止工作,应用线程继续工作.
在这里插入图片描述

4.2.1 Remembered Set(已记忆集合)

在GC年轻代的对象时,我们如何找到年轻代中对象的根对象呢?
跟对象可能实在年轻代中,也可能是在老年代中,那么老年代中的所有对象都是根吗?
如果全量扫描老年代,那么这样扫描下来或耗费很多时间。
SO G1引进了RSet概念。它的全称是Remembered Set,其作用是跟踪指向某个堆内的对象引用。在这里插入图片描述
每个Region初始化时。会初始化一个RSet,该集合用来记录并跟踪其他Region指向该Region中对象的引用,每个Region默认按照512kb换分成多个Card,所以RSet需要记录的东西应该是XX Region的XXcard。

4.3 MixedGC

当越来越多的对象晋升到老年代old region时,为了笔名啊堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器(Mixed GC),该算法并不是一个old GC,除了回收整个Young Region,还会回收一部分的Old Region;
注意:是一部分老年代,而不是全部老年代,可以选择哪些old region进行收集,从而可以对垃圾回收的耗时进行控制。同时Mixed GC也不是Full GC

MixedGC的触发时间:由参数:-XX:InitialtingHeapOccupancyPercent=n决定。默认45%,该参数的意思是:当老年代大小占整个堆大小百分比达到该阈值时触发。

  • 步骤:
    • 全局并发标记(global concurrent marking)
    • 拷贝存活对象(evacuation)
4.3.1全局并发标记
  • 初始标记
    • 标记从根节点直接可达的对象,这个阶段会执行一次年轻代GC,会产生全局停顿。
  • 根区域扫描
    • G1 GC在初始标记的存货区扫描对老年代的引用,并标记被引用的对象
    • 该阶段与应用程序(非STW)同时运行,并且只有完成该阶段后,才会开始下一次STW年轻代垃圾回收。
  • 并发标记(Concurrent Marking)
    • G1 GC在整个堆中查找可访问的(存活的)对象。该阶段与应用程序同时运行,可以被STW年轻代垃圾回收中断。
  • 重新标记(Remark,STW)
    • 该阶段是STW回收,因为程序在运行,针对上一次标记进行修正。
  • 清除垃圾(Cleanup,STW)
    • 清点和重置标记状态,该阶段会STW,这个阶段并不会实际上去做垃圾的收集,等待evacuation阶段来回收。
4.3.2拷贝存活对象

Evacuation阶段是全暂停的。该阶段把一部分Region里的火对象拷贝到另一部分region中,从而实现垃圾的回收清理

4.3.3收集器相关参数

在这里插入图片描述

4.4 对于G1垃圾收集器的优化建议
  • 年轻代大小:
    • 避免使用-Xmn选项或-XX:NewRatio等其他相关选项显示设置年轻代大小
    • 评估G1 GC的吞吐量时,暂停时间目标不要太严苛。目标太过严苛表示您愿意承受更多的垃圾回收开销,而这会直接影响到吞吐量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值