相关文章推荐

近期整理多个 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 后文我们会进行介绍总结。 欢迎留下你的见解。

1、HBase最佳实践 | 聊聊HBase核心配置参数
2、Apache Hudi:剑指数据湖的增量处理框架
3、Hadoop社区比 Ozone 更重要的事情
4、MapReduce Shuffle 和 Spark Shuffle 结业篇

java 启动 参数 共分为三类; 其一是标准 参数 (-),所有的JVM实现都必须实现这些 参数 的功能,而且向后兼容; 其二是非标准 参数 (-X),默认jvm实现这些 参数 的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容; 其三是非Stable 参数 (-XX),此类 参数 各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用; -XX:+<option> 启用option,例如:-... Java 8要使用 CMS (concurrent mark-sweep),那么必须显示设置,它采用的默认垃圾回收器是Parallel GC package codeTest; import java .util.ArrayList; import java .util.List; * @Description Test GC : * @Author sr * @Date 2021/8/29 public class Test GC { privat
OOM:OutOfMemory。内存溢出 cpu 100%: 使用top,查看占用cpu比较高的进程,使用top -Hp 进程ID ,查看对应的占用cpu较高的线程。如果是 java 应用,使用 jstack 导出该线程的堆栈。然后查看哪个方法(栈帧)消耗时间 jstack。 内存飙高: 导出堆内存 jmap,使用jhat 、jvisualvm、mat 等等进行分析。 如何监控JVM: jstat、jvisualvm 等等
一.什么是 CMS 收集器 CMS (Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM 参数 加上**-XX:+UseConcMarkSweep GC ** ,这个 参数 表示对于老年代的回收采用 CMS CMS 采用的基础算法是:标记—清除。 二. CMS 工作步骤 初始标记(STW initial mark) 并发标记(Concurrent marking) 并发预清理(Concurrent preclea
网上关于 cms gc 介绍和调优的文章比较多,但大多没有经过验证。因为 cms 目前在 Java 9之前还是相对用的较多(G1也需要持续去调研),所以这里把 CMS 的一些重要知识和调优经验总结一下 相关jvm源代码版本为/openjdk-8-src-b132-03_mar_2014/openjdk/hotspot/src/share/vm 除了OpenJDK的源代码和R大以外,什么都不要轻易相信 CMS 的一些重要知识点 使用 cms gc 必备的三个 参数 -XX: CMS InitiatingOccupancyFraction这个 参数 是指在使用 CMS 收集器的情况下,老年代使用了指定阈值的内存时,出发Full GC .。如: -XX: CMS InitiatingOccupancyFraction=70 : CMS 垃圾收集器,当老年代达到70%时,触发 CMS 垃圾回收。 查看 CMS InitiatingOccupancyFraction的初始值为-1: 查看...
了解 CMS GC 的同学,一定知道 -XX: CMS ScavengeBeforeRemark 参数 ,它是用来开启或关闭在 CMS -remark 阶段之前的清除(Young GC )尝试。 大家都知道 CMS GC 只会回收 OldGen 的对象,那为什么需要这个 参数 ? 由于 YoungGen 存在引用 OldGen 对象的情况,因此 CMS -remark 阶段会将 YoungGen 作为 OldGe...
Python面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作封装在对象中,通过对象之间的交互实现程序的设计和开发。下面是一些关键概念,帮助你更好地理解Python面向对象编程。 1. 类(Class):类是对象的蓝图或模板,描述了对象的属性和行为。它定义了对象的特征和方法。例如,我们可以定义一个名为"Car"的类来表示汽车,其中包含属性(如颜色、型号)和方法(如加速、刹车)。 2. 对象(Object):对象是类的实例,是具体的实体。通过实例化类,我们可以创建一个对象。例如,我们可以创建一个名为"my_car"的对象,它是基于"Car"类的实例。 3. 属性(Attribute):属性是对象的特征,用于描述对象的状态。每个对象都可以具有一组属性。例如,"Car"类的属性可以包括颜色、型号等。 4. 方法(Method):方法是对象的行为,用于定义对象的操作。每个对象都可以具有一组方法。例如,"Car"类的方法可以包括加速、刹车等。 5. 继承(Inheritance):继承是一种机制,允许我们创建一个新类(称为子类),从现有类(称为父类)继承属性和方法。子类可以扩展或修改父类的功能。继承可以实现代码重用和层次化设计。 6. 多态(Polymorphism):多态是一种特性,允许不同类的对象对同一方法做出不同的响应。多态提高了代码的灵活性和可扩展性。 7. 封装(Encapsulation):封装是一种将数据和操作封装在对象中的机制,隐藏了对象的内部实现细节,只暴露必要的接口给外部使用。这样可以保护数据的安全性,提供了更好的模块化和代码复用性。 通过理解这些概念,你可以更好地掌握Python面向对象编程。在实践中,你可以使用类来创建对象,操作对象的属性和调用对象的方法,通过继承和多态实现代码的灵活性和可扩展性,通过封装保护数据的安全性和提高代码的可维护性。
感谢祝江华的辛勤力作。我自己看了一下书的目录,特别吸引我的地方是 1. 从目录来看,这本书几乎是一本HDFS的百科全书,非常全面,无所不包 2.这本书基于社区3.0 hadoop,很难得。 3. 目录中的确列出了很多3.0 hadoop的新特性,让我非常感兴趣,比如纠偏码,Router-based Federation,这些都是特别有价值的feature并且在书中有介绍。 4.这本书的深度非常适合我这个从事hdfs好几年的人,原理,代码都有,而不是像很多HDFS的书籍一样,总是在入门,总是在概念层面泛泛而谈。 HBase 性能测试之读写P999延时压测实践 weixin_47047295: 写入大量数据是ssh容易断开,写入失败怎么解决 《Hadoop HDFS深度剖析与实践》新书推荐与回馈新书活动 | 回馈赠书 故事不长丨: 数据湖 | 一文读懂Data Lake的概念、特征、架构与案例 太白山鹰: 云原生架构有四个核心要素: 1.容器化部署docker或者k8s 2.微服务化 3.敏捷开发和上线CICD 4.应用跑在云上
 
推荐文章