JVM-GC,“大话'”垃圾收集器

本文深入解析JVM中各种垃圾收集器的工作原理与特性,包括Serial、ParNew、ParallelScavenge、SerialOld、ParallelOld、CMS及G1收集器。探讨了不同收集器在吞吐量、停顿时间、并行与并发等方面的优劣,适用于不同场景的选择策略。

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

基于JDK1.7 update 14之后的HotSpot虚拟机的垃圾收集器。

1. Serial收集器

Client模式下的默认新生代垃圾收集器。

  • 单线程、单CPU
  • STW
  • 简单高效

2. ParNew收集器

Serial收集器的多线程版本,Server模式下虚拟机新生代垃圾收集器。

  • 多线程

目前为止,只有前面这两种垃圾收集器能够与CMS收集器(并发,垃圾收集线程和用户线程几乎同时进行)配合工作。使用CMS时新生代收集器只能选择ParNewh或者Serial收集器中的一个。ParNew收集器也是使用-XX:+UseConcMarkSweepGC选项后的默认新生代收集器,也可以使用-XX:UseParNewGC选项强制指定他。

注:并发和并行

  • 并发:指用户线程与垃圾收集线程同时执行(但不一定是并行执行,可能会交替执行),用户程序继续运行,而垃圾收集程序运行于另一个CPU上。
  • 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
  • 单线程中ParNew不比Serial好。
  • -XX:ParallelGCThreads可以限制垃圾收集的线程数。

3. Parallel Scavenge收集器(吞吐量优先)

并行的多线程新生代垃圾收集器,注重吞吐量(运行用户代码所需时间/(运行用户代码所需时间+垃圾收集时间))

  • 控制最大垃圾收集停顿时间 -XX:MaxGCPauseMillis
  • 直接设置吞吐量大小 -XX:GCTimeRatio(0-100)

注:

  • GC停顿时间缩短是牺牲吞吐量和新生代空间换取的
  • -XX:UseAdaptiveSizePolicy自动配置参数细节,GC自适应调节策略,只需要把基本属性设置好(-Xmx),然后使用XX:MaxGCPauseMillis和XX:GCTimeRatio给虚拟机设立一个优化目标,具体细节就交给虚拟机进行处理。

4. Serial Old收集器

Serial收集器的老年代版本,Client模式下虚拟机的使用

  • 单线程
  • 标记-整理
  • JDK1.5前与Parallel Scavenge搭配使用
  • CMS的后备方法,并发收集发生Concurrent Mode Failure时使用

注:

  • safePoint安全点进行STW
  • 单线程老年代收集器在Server端无法充分利用服务器多CPU的处理能力

5. Parallel Old收集器

Parallel Scavenge的老年代版本,JDK1.6之后才出现

  • 多线程
  • 标记-整理
    注:
  • 注重吞吐量以及CPU资源敏感的场合,都可以使用Parallel Scavenge和Parallel Old的应用组合

6. CMS收集器

Concurrent Mark Sweep(并发标记-清除)获取最短回收停顿时间为目标的收集器

  • 4个基本步骤:
  1. 初始标记-CMS initial mark(需STW)标记GC Roots能直接关联到的对象
  2. 并发标记-CMS Concurrent mark GC Roots Tracing的过程
  3. 重新标记-CMS remark(需STW)修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录
  4. 并发清除-CMS Concurrent sweep
  • 并发收集
  • 低停顿

注:

  • 也称作并发低停顿收集器(Concurrent Low Pause Collector)
  • 3个明显缺点:
  1. CMS对CPU资源特别敏感。默认启动的回收线程数是(CPU数量+3)/4
  2. CMS收集器无法处理浮动垃圾,可能出现Concurrent Mode Failure失败而导致另一次Full GC的产生
  3. 产生空间碎片(不过默认提供了一个(默认开启)参数-XX:UseCMSCompactAtFullConllection自动进行)

7*. G1(Gabage First)收集器

面向服务端应用的收集器

  • 并行与并发:充分利用CPU、发挥多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短STW时间。
  • 分代收集
  • 空间整合:不会因为无法找到连续的内存空间而提前触发下一次GC
  • **可预测的停顿:**建立了可预测停顿时间的模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不超过N毫秒。
  • 它将整个Java堆划分为多个大小相等的独立区域(Region),新生代和老年代都是一部分Region(不需要连续)的集合。
  • 有计划的避免在Java堆中进行全区域的垃圾收集。
  • 后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(Gabage First的由来)
  • Region之间的对象引用以及其他收集器中新生代与老年代之间的对象引用,虚拟机都是使用Remembered Set来避免堆扫描的。G1中每个Region都有对应的Remembered Set

G1收集器的运作可划分为几个步骤:

  1. 初始标记-Initial Marking(需STW,时间很短)
  2. 并发标记-Concurrent Marking
  3. 最终标记-Final Marking(需STW,但可并行)
  4. 筛选回收-Live Data Counting And Evaluation
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pHscccr_Ayyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值