垃圾收集器

 


image.png

1. Serial收集器

image.png

是一个单线程垃圾收集器,垃圾收集过程过程中会STW,新生代使用标记-复制算法,老年代使用标记-整理算法。

启动参数:-XX:+/-UseSerialGC,可应用于客户端模式下虚拟机。

2. ParNew收集器

image.png

Serial收集器的多线程版本,能与CMS收集器配合工作。

老年代使用CMS后(-XX:+/-UseConcMarkSweepGC),新生代模式使用ParNew。

启动参数:-XX:+/-UseParNewGC(JDK9取消),默认开启收集线程数与处理器核心数量相同,可通过-XX:ParallelGCThreads设置

3. Parallel Scavenge收集器

image.png

吞吐量优先的一款垃圾收集器,使用标记-复制算法。

吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 运行垃圾收集时间)

高吞吐量可以最高效的完成程序的运算任务。适合在后台运算而不需要太多交互的分析任务。

内存回收时间上限值:-XX:MaxGCPauseMillis,值为大于0的毫秒数,收集器尽力保证内存回收时间不超过该值。

垃圾回收时间占比设置:-XX:GCTimeRatio,值为0到100之间的整数n,允许最大垃圾收集时间为1/(1+n)。

Parallel Scanenge收集器的一个重要特征就是智适应大小调整策略,即:-XX:+/-UseAdaptiveSizePolicy。JDK8默认开启,具体调节工作由虚拟机完成。

4. Serial Old收集器

image.png

 

Serial收集器的老年代版本,使用标记-整理算法。

可应用于客户端模式下虚拟机。

5. Parallel Old收集器

image.png

Parallel Scavenge收集器的老年代版本,使用标记-整理算法,支持多线程并发收集,是一块吞吐量优先的收集器。

6. CMS收集器

image.png

获取最短回收停顿时间为目标的收集器,使用标记-清除算法,是一款并发收集、低停顿的收集器,可以给用户带来良好的交互体验。

包含四个步骤:

  • 初始标记
    • 标记GC Roots能直接关联到的对象
  • 并发标记
    • 从GC Roots的直接关联对象开始遍历整个对象图
  • 重新标记
    • 修正并发标记期间,标记产生变动的那一部分对象的标记记录
  • 并发清除
    • 删除判断已经死亡的对象

存在三个缺点:

  • 对处理器资源敏感
    • 默认回收线程数是:(处理器核心数量 + 3)/ 4
  • 无法处理浮动垃圾
    • 并发标记和并发清除阶段用户线程产生的垃圾无法处理,可能触发Full GC
    • CMS需预留老年代一部分空间给用户线程
      • 通过参数-XX:CMSIniatingOccuPancyFrantion适当调高CMS触发百分比,降低内存回收频率,获得更好的性能
      • 参数设置过高可能导致预留的内存无法满足分配新对象的需要,此时,虚拟机将启动后备方案:临时启用Serial Old收集器进行垃圾收集
  • 会产生大量空间碎片
    • 可能导致没有连续的空间存放大对象而触发Full DC
    • 通过-XX:CMSFullGCsBeforeCompaction设置CMS收集器在执行若干次不整理空间的FunnGC后,下一次进入Full GC会先进性碎片整理

7. G1收集器

image.png

主要面向服务端应用的垃圾收集器,使用标记-复制算法,采用局部收集的设计思路和基于Region的内存布局形式。

针对配备多颗处理器及大容量内存的机器,以极高概率满足GC 停顿时间要求的同时,还具备高吞吐量性能特征。

G1垃圾收集器不区分新生代和老年代,而是将Java对划分为多个大小相等的Region,JVM最多可以有2048个Region。

一般Region大小等于堆大小除以2048,如:堆大小为4096M,则Region大小为2M。

包含四个步骤:

  • 初始标记
    • 仅标记GC Roots能直接关联到的对象
  • 并发标记
    • 从GC Roots的直接关联对象开始遍历整个对象图
  • 最终标记
    • 修正并发标记期间发生引用变动的对象
  • 筛选回收
    • 更新Region的统计数据,对各个Region的回收价格和成本进行排序,根据用户期望的停顿时间(-XX:MaxGCPauseMillis)来制定回收计划
    • 比如:老年代此时有1000个 Region都满了,但是因为根据预期停顿时间,本次垃圾回收可能只能停顿200毫秒,那么通过之前回收成本计算得知,可能回收其中800个Region刚好需要200ms,那么就只会回收800个Region,尽量把GC导致的停顿时间控制在我们指定的范围内。

8. ZGC收集器

ZGC是在JDK11加入的具有实验性质的低延迟垃圾收集器。

ZGC采用基于Region的堆内存布局,且可以动态创建和销毁,必须为2MB的整数倍

三个特性:

  • 支持TB量级的堆
  • 最大GC停顿时间不超过10毫秒
  • 停顿时间不会堆的增大而增大
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值