本文背景

在对于去哪儿网的《ZGC 在去哪儿机票运价系统实践》的这篇文章阅读之后,对于parNew+cms这对垃圾收集的组合和g1以及zgc这几种垃圾收集器有了更加深入的了解,特此形成图文总结,方便以后再有需要的时候进行查阅复习。以及ZGC的一些简单调优

GC适应场景小侃

查看当前JDK版本的使用的垃圾收集器

java -XX:+PrintCommandLineFlags -version

image.png

Parallel Scavenge + Parallel Old 组合

在默认的1.8的默认版本中就是使用`parallel scavenge + parallel old`的垃圾收集来做垃圾回收之用,其实Parallel和ParNew收集器的最大区别就在于关注点的不同,Parallel Scavenge主要关注的是`可控制的吞吐量`。也就是说如果我们的系统是后台运算类任务,类似中台的的数据处理等任务可以使用这种组合来进行设置

ParNew + CMS组合

可以通过参数设置使得1.8中使用这种垃圾收回收器进行工作。`-XX:+UseConcMarkSweepGC`,为什么还有会ParNew + CMS的组合呢? CMS是一款老年代垃圾回收器,其关注点是在尽可能的缩短垃圾收集时用户线程的停顿时间。也就是就更关注用户的感受,快速响应用户请求。

但是CMS的问题在于使用的是标记清楚算法,虽然是做到了并发清理,但是会产生大量的内存碎片,并且其使用的分代模型,每次只能在年轻代或者老年代回收,这样就无法空时STW的时间,且STW的时间会随着堆的增大而增大。

G1

G1也是一款有划时代意义的垃圾收集齐了,其在吸收了CMS并发标记(使用卡表实现),使用了堆内存分析模型(物理分区,逻辑分代的概念),默认划分了2048个region,就可以有策略的选择需要回收的内存区域,从而能够控制STW的时间。不过G1 为了解决CMS并发清理导致的内存碎片化的问题时,采用标记复制来进行对象转移,相当于是转移全阶段STW,停止用户线程,那么G1的瓶颈相当于就在对象的转移阶段。
因为CMS在回收的时候可能会产生大量的浮动垃圾,内存利用率下降严重,故此推出G1,G1采用的是逻辑分区,使用region来划分内存块。但是G1 也有自己的问题就是新生代内存回收的仍然采用的是标记-复制的算法来进行对象的转移。

ZGC

然后就是全并发的ZGC闪亮登场了,ZGC在标记、转移和重定位阶段几乎都是并发,这也是它能够实现停顿时间小于10ms的关键原因。它使用的是一种染色指针和读屏障的技术解决了准确访问对象的问题,实现了并发转移。(具体了解的话,可以参加文末美团大佬关于ZGC的着色指针和读屏障相关解释)
但就算是这样ZGC还是有需要解决的问题的,比如说:

  • 产生了过多的浮动垃圾
  • 去掉分代对象之后没有了冷热之分
  • 长时间的并发标记和并发转移牺牲的系统的吞吐量(耗费CPU来进行指针的计算)

根据官方数据最高可能随时系统15%的吞吐量

ZGC的相关调优参数

整体来说ZGC已经相当智能了,其实这个也是垃圾回收器的一部发展史,必然是朝着越来越智能化的方向来发展的,所以总的来说需要我们调优的参数其实并不多,因为其特性已经将垃圾回收的时间控制在10ms以内了,所以我们主要关心的还是垃圾回收的次数。
想要优化次数的话,先要搞清楚ZGC的的触发垃圾回收的时间节点:

  • 阻塞内存分配请求出发:当垃圾来不及回收,垃圾将堆占满时,会导致部分线程阻塞。日志中的关键字为Allocation Stall
  • 基于分配速率的自适应算法: 最主要的GC触发方式 日志中的关键字为:Allocation Rate

可以理解为: ZGC根据近期的对象分配速率以及GC时间,计算内存占用达到什么阈值出发下一次GC
说人话就是 根据你最近分配对象的速度和耗时,计算下当前内存情况下次大概在什么时候会再次出发GC

  • 主动触发规则:类似固定间隔规则,是ZGC自行推算的时机。日志关键字: Proactive

调优的思路就是尽量不出现stall和rate关键字
为了减少stall的出现,尽量在堆快要占满的时候让ratex进行内存回收
为了减少rate的出现,尽量提高堆内存的利用率
根据官方建议我们只调整两个大小

  • 堆大小 (-Xmx -Xms) 设置更大的堆空间
  • ZGC的线程数(-XX:ConcGCThread) 调整线程控制rate gc回收的速度

参考文章:

原文地址:http://www.cnblogs.com/hatricks/p/16887715.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性