美文网首页
一文彻底搞懂 CMS GC 参数配置

一文彻底搞懂 CMS GC 参数配置

作者: 大数据技术架构 | 来源:发表于2020-02-05 12:41 被阅读0次

近期整理多个 HBase 集群的 JVM 参数,发现都是默认的 CMS GC 配置,如何调优 JVM 参数就成了一个绕不过的话题。因此,为了寻求一个 CMS GC 的 JVM 合理参数配置,笔者参考多篇社区文章及相关博客,总结了一些 CMS 相关的知识点,以及一套基于 CMS 的 JVM 参数配置。

CMS GC 要点

CMS(Concurrent Mark Sweep,并发-标记-清除)是目前最常用的 JVM 垃圾回收器,这里不解释 CMS 的工作过程,只记录一些基础要点以帮助理解后面的内容:

  • CMS 是一种基于并发、使用标记清除算法的垃圾回收器。CMS 会尽可能让 GC 线程与用户线程并发执行,可以消除长时间的 GC 停顿(STW)。

  • CMS 不会对新生代做垃圾回收,默认只针对老年代进行垃圾回收。此外,CMS 还可以开启对永久代的垃圾回收(或元空间),避免由于 PermGen 空间耗尽带来 Full GC,JDK6以上受参数 -XX:+CMSClassUnloadingEnabled 控制,这个参数在 JDK8 之前默认关闭,JDK8 默认开启了。

  • CMS 要与一个新生代垃圾回收器搭配使用,所谓"分代收集"。能与 CMS 配合工作的新生代回收器有 Serial 收集器和 ParNew 收集器,我们一般使用支持多线程执行的 ParNew 收集器。

  • 使用 CMS GC 策略时,GC 类别可以分为:Young GC(又称 Minor GC),Old GC(又称 Major GC、CMS GC),以及Full GC。其中 Full GC 是对整个堆的垃圾回收,STW 时间较长,对业务影响较大,应该尽量避免 Full GC。

JVM 参数配置

经过理解各个参数的含义及取值影响,总结了以下的 JVM 参数配置,可以几乎不用调整使用:

-Xmx32g -Xms32g -Xmn1g -Xss256k
-XX:SurvivorRatio=2 -XX:MaxPermSize=256m
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:ParallelGCThreads=10
-XX:ParallelCMSThreads=16
-XX:+CMSParallelRemarkEnabled
-XX:MaxTenuringThreshold=15
-XX:+UseCMSCompactAtFullCollection
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:+CMSClassUnloadingEnabled
-XX:-DisableExplicitGC
-XX:+HeapDumpOnOutOfMemoryError
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:/app/log/hbase/gc-hbase-REGIONSERVER-`hostname`-`date +%Y%m%d`.log

如果是 64G 及以上的大堆,-Xmn 可以调整到2g,其他参数不变或微调。下面对一些重要的 JVM 参数介绍说明。

重点参数解析

以下参数解析都建立在使用 CMS GC 策略基础上,这里使用 CMS GC 表示老年代垃圾回收,Young GC 表示新生代垃圾回收。

① -Xmx, -Xms, -Xmn

-Xmx、-Xms 分别表示 JVM 堆的最大值,初始化大小。-Xmx 等价于-XX:MaxHeapSize,-Xms 等价于-XX:InitialHeapSize。

-Xmn表示新生代大小,等价于-XX:MaxNewSize、-XX:NewSize,这个参数的设置对 GC 性能影响较大,设置小了会影响 CMS GC 性能,设置大了会影响 Young GC 性能,建议取值范围在1~3g,比如32g堆大小时可以设为1g,64g堆大小时可以设为2g,通常性能会比较高。

② -Xss

表示线程栈的大小,等价于-XX:ThreadStackSize,默认1M,一般使用不了这么多,建议值256k。

③ -XX:SurvivorRatio

新生代中 Eden 区与 Survivor 区的比值,默认8,这个参数设置过大会导致 CMS GC 耗时过长,建议调小,使得短寿对象在Young区可以被充分回收,减少晋升到Old区的对象数量,以此提升 CMS GC 性能。

④ -XX:+UseParNewGC, -XX:+UseConcMarkSweepGC

分别表示使用并行收集器 ParNew 对新生代进行垃圾回收,使用并发标记清除收集器 CMS 对老年代进行垃圾回收。

⑤ -XX:ParallelGCThreads, -XX:ParallelCMSThreads

分别表示 Young GC 与 CMS GC 工作时的并行线程数,建议根据处理器数量进行合理设置。

⑥ -XX:MaxTenuringThreshold

对象从新生代晋升到老年代的年龄阈值(每次 Young GC 留下来的对象年龄加一),默认值15,表示对象要经过15次 GC 才能从新生代晋升到老年代。设置太小会严重影响 CMS GC 性能,建议默认值即可。

⑦ -XX:+UseCMSCompactAtFullCollection

由于 CMS GC 会产生内存碎片,且只在 Full GC 时才会进行内存碎片压缩(因此 使用 CMS 垃圾回收器避免不了 Full GC)。这个参数表示开启 Full GC 时的压缩功能,减少内存碎片。

⑧ -XX:+UseCMSInitiatingOccupancyOnly , -XX:CMSInitiatingOccupancyFraction

-XX:CMSInitiatingOccupancyFraction 表示触发 CMS GC 的老年代使用阈值,一般设置为 70~80(百分比),设置太小会增加 CMS GC 发现的频率,设置太大可能会导致并发模式失败或晋升失败。默认为 -1,表示 CMS GC 会由 JVM 自动触发。

-XX:+UseCMSInitiatingOccupancyOnly 表示 CMS GC 只基于 CMSInitiatingOccupancyFraction 触发,如果未设置该参数则 JVM 只会根据 CMSInitiatingOccupancyFraction 触发第一次 CMS GC ,后续还是会自动触发。建议同时设置这两个参数。

⑨ -XX:+CMSClassUnloadingEnabled

表示开启 CMS 对永久代的垃圾回收(或元空间),避免由于永久代空间耗尽带来 Full GC。

在线工具
GC在线参数检查与优化:https://xxfox.perfma.com
GC在线日志分析:https://gceasy.io/

参考文档
http://hbasefly.com/2016/08/09/hbase-cms-gc/
https://mp.weixin.qq.com/s/gddff77gPdi5s2Hc9HBtcg
https://mp.weixin.qq.com/s/euey8visBvINQNOF0AiACQ

目前我们主要使用 CMS,其实比较大的heap建议使用 G1 垃圾回收器,关于 G1 后文我们会进行介绍总结。欢迎留下你的见解。

往期文章精选

Apache Hudi 0.5.1版本重磅发布

贝壳找房基于 Flink 的实时平台建设

网易基于 HBase 的最佳实践

小米流式平台架构演进与实践

如果您喜欢这篇文章,点【在看】与转发都是一种鼓励,期待得到您的认可 ❥(^_-)

相关文章

  • 一文彻底搞懂 CMS GC 参数配置

    近期整理多个 HBase 集群的 JVM 参数,发现都是默认的 CMS GC 配置,如何调优 JVM 参数就成了一...

  • JVM学习13·GC日志

    1.GC 常用参数 2.Parallel 常用参数 3.CMS 常用参数 -XX:+UseG1GC 启用CMS垃...

  • GC常用参数

    GC常用参数 Parallel常用参数 CMS常用参数

  • java System.gc 说明

    在没有任何jvm参数配置的情况下,默认System.gc会触发一次full gc。针对cms gc的情况下,默认其...

  • CMS GC启动参数优化配置

    简介: java启动参数共分为三类;其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;...

  • JVM调优学习整理

    JVM参数的含义 并行收集器相关参数 CMS相关参数 辅助信息 GC性能方面的考虑对于GC的性能主要有2个方面的指...

  • 彻底搞懂 c++ 函数参数的 & 和 &&

    彻底搞懂 c++ 函数参数的 & 和 &&

  • jvm GC参数调优

    (本篇主要以CMS-GC为主,如果对G1感兴趣的我后面也可以补充) 一、GC参数说明与介绍 1.1 jvm启动参数...

  • JVM第三天-GC算法

    一、JVM常见参数配置 Trace 跟踪的参数 1.打印GC日志信息 -verbose:gc -XX:+Prin...

  • Java GC分析

    [TOC] 1、如何收集GC日志 1.1、 配置JVM启动参数: 1.2、 GC相关启动参数说明 1.2.1、简单...

网友评论

      本文标题:一文彻底搞懂 CMS GC 参数配置

      本文链接:https://www.haomeiwen.com/subject/anxsxhtx.html