首页 > 其他分享 >垃圾收集器使用场景和ZGC的简单调优

垃圾收集器使用场景和ZGC的简单调优

时间:2022-11-13 23:47:17浏览次数:77  
标签:G1 收集器 回收 调优 内存 ZGC CMS 垃圾

本文背景

在对于去哪儿网的《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回收的速度

参考文章:

标签:G1,收集器,回收,调优,内存,ZGC,CMS,垃圾
From: https://www.cnblogs.com/hatricks/p/16887715.html

相关文章

  • jvm调优思路及调优案例
    jvm调优思路及调优案例​ 我们说jvm调优,其实就是不断测试调整jvm的运行参数,尽可能让对象都在新生代(Eden)里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代......
  • 【SpringBoot 技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲
    Undertowweb容器Undertow介绍Undertow是红帽公司开发的一款基于NIO的高性能Web嵌入式服务器,红帽公司(RedHat)的开源产品,且是WildFly8(JBoss)默认的Web服务器.;官网API......
  • 性能调优
    性能调优的第一步是建立性能基线。DBA通过定期收集性能数据与不同时期的基线比较,通过偏差分析和趋势分析,宏观上把控数据库的整体状态。如:随着业务量的持续攀升,bat......
  • 记一次 压测调优
    背景:同步生产环境的MySQL、Redis到腾讯云,作为test2压测环境 【具体优化点】一、数据库连接池修改petem-booking服务最大链接池数量maximum-pool-size、minimum......
  • JVM调优工具使用手册
    ​ 作为Java开发人员,我们肯定知道JDK的bin目录下有"java.exe"、"javac.exe"这两个命令工具,这也是我们平时用得最多的工具。但其实bin目录下还有很多工具,这些工具可以帮助......
  • 11_性能调优_如何调优_性能问题_跟踪问题_SQL规划
    一、如何性能调优1、设置性能预期可以接受的查询时间,每分钟的查询数等等;基准线(Benchmarks) 2、了解当前系统的基本的硬件性能I/O:磁盘吞吐量,容量、CUP、内存、网络; ......
  • 系统调优总结
    一、算法调优1、分而治之和预处理:以前有一个程序为了生成月报表,每次都需要计算很长的时间,有时候需要花将近一整天的时间。于是我们把我们找到了一种方法可以把这个算法发......
  • R语言决策树和随机森林分类电信公司用户流失churn数据和参数调优、ROC曲线可视化
    在本教程中,我们将学习覆盖决策树和随机森林。这些是可用于分类或回归的监督学习算法。从决策树到随机森林:R语言信用卡违约分析信贷数据实例,时长10:11 下面的代码将加载本教......
  • Elasticsearch调优
    设计阶段调优1.根据业务增量需求,采取基于日期模板创建索引,通过rolloverAPI滚动索引;2.使用别名进行索引管理;3.每条凌晨定时对索引做force_merge操作,以释放空间。4.采取冷......
  • 深入理解JVM - 垃圾收集器
    垃圾回收主要是要解决3件事情:那些内存需要回收?如何回收?什么时候回收?术语解释并行/并发并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。并发(Concur......