目前小米已经在线上开始大规模使用G1垃圾回收算法,在论坛中也看到一些朋友在讨论使用G1碰到的各种各样的问题,这里打算写一篇文章记录下调G1的一些经验。
先传送门一下,之前在HBaseConAsia2017分享过一个G1GC调优的PPT: 

http://openinx.github.io/2012/01/01/my-share/
首先,对G1算法不熟悉的同学,可以仔细读一读Oracle的G1算法教程,教程基本交代了G1的运行原理以及和CMS本质区别,如果对算法细节感兴趣,可以读一下Garbage-First Garbage Collection这篇论文,JVM的G1实现应该是按照这篇论文来的.

为了便于统计G1GC的日志信息,我们需要开启以下所有的G1参数:

-Xmx30g -Xms30g
-XX:MaxDirectMemorySize=30g
-XX:+UseG1GC
-XX:+UnlockExperimentalVMOptions
-XX:MaxGCPauseMillis=90
-XX:G1NewSizePercent=8
-XX:InitiatingHeapOccupancyPercent=30
-XX:+ParallelRefProcEnabled
-XX:ConcGCThreads=4
-XX:ParallelGCThreads=16
-XX:MaxTenuringThreshold=1
-XX:G1HeapRegionSize=32m
-XX:G1MixedGCCountTarget=64
-XX:G1OldCSetRegionThresholdPercent=5

其中重点需要调优的参数主要有:
1. G1NewSizePercent :G1的Young区大小是通过算法来自适应确定的, 也就是根据之前Young区GC的耗时来确定之后的Young大小,如果耗时过长,则调小Young区,耗时过短,则调大Young区. 这个参数表示Young的最小百分比.
2. InitiatingHeapOccupancyPercent: 当占用内存超过这个百分比的时候, G1开始执行多次Mixed GC来整理老年代内存碎片.
3. G1MixedGCCountTarget: 当占用内存超过InitiatingHeapOccupancyPercent阀值时, 最多通过多少次Mixed GC来将内存控制在阀值之下.
4. MaxTenuringThreshold: 当一个对象gc的代数超过这个值的时候, 会将对象从young区挪到old区.
5. G1HeapRegionSize: 表示G1将每个Region切分成多大, 注意一定要写单位, 例如32m.
由于每个参数的取值范围非常广, 例如G1NewSizePercent一般可以从0到10不等(甚至可以取更大), 而且参数众多. 于是, 我们写一个脚本用来修改每一个参数,然后自动重启, 并记录每个参数的测试开始时间点和结束时间点. 后面只需要通过工具自动分析gc日志即可. 这里, 脚本每次只会调整一个参数, 然后重启整个集群, 然后通过PerformanceEvaluation工具进行压力测试, 压力测试会跑一个小时,跑完之后调整下一个参数, 后续接着跑.
脚本地址在这里: 

https://github.com/openinx/scripts/blob/master/java-g1gc-tuning.py
跑完所有的参数之后, 后续就需要通过工具来分析G1的日志了, 之前HubSpot开发了一个Python工具, 叫做gc_log_visualizer , 这个工具通过正则提取日志数据, 然后绘制成监控图, 比较方便查看G1的全局状态。



大家工作学习遇到HBase技术问题,把问题发布到HBase技术社区论坛http://hbase.group,欢迎大家论坛上面提问留言讨论。想了解更多HBase技术关注HBase技术社区公众号(微信号:hbasegroup),非常欢迎大家积极投稿。


©著作权归作者所有:来自51CTO博客作者mb5fdb0a6739180的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 激光雷达有哪些重要参数?
  2. 基于行列式点过程的推荐多样性提升算法
  3. 【Github】NLPer-Interview: NLP 算法工程师相关的面试题
  4. 互联网后端架构知识图谱
  5. ALBERT 告诉了我们什么?
  6. 如何构建阿里小蜜算法模型的迭代闭环?
  7. Bandit算法在携程推荐系统中的应用与实践
  8. C语言中的择中,二分查找算法解析
  9. flex基础:flex容器中的四个属性的功能,参数,以及作用

随机推荐

  1. 认识并编写一个Makefile
  2. uinx 信号 SIGINT SIGTERM SIGKILL区别
  3. Linux文件归档和解压缩
  4. 本人新手,询问一下有谁用过lameditor-1.0?
  5. Linux系统下查看目录大小
  6. ubuntu 14.04 安装 minidwep-gtk, aircra
  7. 在Ubuntu 16.04上利用Jexus+.Net Core+Li
  8. [Linux][Madplay播放器移植mini2440(ARM9
  9. Linux下PHP连接MS SQLServer的办法
  10. 【原】第一个Linux设备驱动程序hello wor