联系
Knight's Tale » 技术

JVM GC调试的一些经验

2020-03-18 01:04

相关结论

  • 目前来说,大部分程序基本上都会用G1收集器,CMS已经有点过时了
  • 使用G1时,按文档中说不要指定年轻代的大小,但是实际上要指定,否则年轻代太小了,导致频繁YGC。可参见 《RocketMQ 迈入50万TPS消息俱乐部》http://jm.taobao.org/2017/03/23/20170323/
  • 关于G1的一些介绍文章:《HotSpot的G1收集器(日志分析)》 https://blog.csdn.net/fouy_yun/article/details/78376154 ;《Java Hotspot G1 GC的一些关键技术》 https://tech.meituan.com/2016/09/23/g1.html ;《可能是最全面的G1学习笔记》 https://zhuanlan.zhihu.com/p/54048685
  • hashmap如果巨大,请设置初始化大小
  • 频繁GC (Allocation Failure)及young gc时间过长分析 https://juejin.im/post/5a9b811a6fb9a028e46e1c88

G1相关参数设置

  • -XX:G1HeapRegionSize=n 用于设置RSet的大小, The minimum value is 1Mb and the maximum value is 32Mb. 譬如,可以设置 16m
  • -XX:G1ReservePercent=25 设置作为空闲空间的预留内存百分比,以降低目标空间溢出的风险。默认值是 10%。增加或减少百分比时,请确保对总的 Java 堆调整相同的量。Java HotSpot VM build 23 中没有此设置。
  • -XX:InitiatingHeapOccupancyPercent=30 设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。
  • -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SoftRefLRUPolicyMSPerMB=N 这个参数比较有用的,官方解释是:Soft reference在虚拟机中比在客户集中存活的更长一些。其清除频率可以用命令行参数 -XX:SoftRefLRUPolicyMSPerMB=来控制,这可以指定每兆堆空闲空间的 soft reference 保持存活(一旦它不强可达了)的毫秒数,这意味着每兆堆中的空闲空间中的 soft reference 会(在最后一个强引用被回收之后)存活1秒钟。注意,这是一个近似的值,因为 soft reference 只会在垃圾回收时才会被清除,而垃圾回收并不总在发生。系统默认为一秒,我觉得没必要等1秒,客户集中不用就立刻清除,改为 -XX:SoftRefLRUPolicyMSPerMB=0;
  • -XX:SurvivorRatio=8 -XX:+DisableExplicitGC
  • -XX:+PrintAdaptiveSizePolicy 打印自适应调节策略,当出现Full GC的时候可以看到相关信息

主要参考:

  • http://jm.taobao.org/2017/03/23/20170323/
  • https://www.oracle.com/technetwork/cn/articles/java/g1gc-1984535-zhs.html

相关最佳实践

-server -Xms8g -Xmx8g -Xmn4g -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:+DisableExplicitGC -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m

本文链接地址:JVM GC调试的一些经验