资料整理于网上,相关参数也在生产实践中操作过。
(0)使用 perfma 生成 JVM 参数
https://opts.console.perfma.com/
(1)在 JVM 参数中一定要设置
-XX:+HeapDumpAfterFullGC-XX:+HeapDumpOnOutOfMemoryError
两个参数,可以在发送 FGC 和 OOM 的时候将当时的 Java 堆情况记录下来,用于事后分析;
-XX:HeapDumpPath=/data/gc
这个参数与
-XX:+HeapDumpOnOutOfMemoryError
共同作用,设置 heap-dump 时内容输出文件。
(2)GC 日志要单独打印到一个日志文件中,方便分析,如果不特别设置则 GC 日志会打印到 stdout.log 中,和其他的日志混合在中间,影响后面的问题排查。
启用 gc 日志打印功能
-XX:+PrintGCDetails
打印可读的日期而不是时间戳
-XX:+PrintGCDateStamps
使用
-XX:GCLogFileSize
设置合适的 GC 日志文件大小,
使用
-XX:NumberOfGCLogFiles
设置要保留的 GC 日志文件个数,
使用
-Xloggc:/path/to/gc.log
设置 GC 日志文件的位置
(3)设置负责垃圾收集的线程个数,这个参数的值的设置,跟 CPU 有关,如果物理 CPU 支持的线程个数小于 8,则最多设置为 8;如果物理 CPU 支持的线程个数大于 8,则默认值为 number * 5/8
-XX:ParallelGCThreads
(4)设置堆的大小
-Xmx5440M-Xms5440M
(5)JDK8 的永生代几乎可用完机器的所有内存,为了保护服务器不会因为内存占用过大无法连接,需要设置一个 512M 的初始值,512M 的最大值保护一下
-XX:MaxMetaspaceSize=512M-XX:MetaspaceSize=512M
(6)设置 G1 的耗时
-XX:+UseG1GC-XX:MaxGCPauseMillis=100
毫秒数,收集器会尽量的保证垃圾回收耗时不超过设定的这个阀值,但是如果太小的话,会导致 GC 的频率增加
(7)并行地处理 Reference 对象
-XX:+ParallelRefProcEnabled
默认为 false,并行地处理 Reference 对象,如 WeakReference,除非在 GC log 里出现 Reference 处理时间较长的日志,否则效果不会很明显。
(8)指定致命错误日志位置。一般在 JVM 发生致命错误时会输出类似 hs_err_pid.log 的文件,默认是在工作目录中(如果没有权限,会尝试在/tmp 中创建),不过还是自己指定位置更好一些,便于收集和查找,避免丢失
-XX:ErrorFile=/data/gc/hs_err_pid%p.log
(9)程序执行类加载
-verbose:class
(10)打印 JVM 在两次停顿之间正常运行时间,与
-XX:+PrintGCApplicationStoppedTime
一起使用效果更佳。
-XX:+PrintGCApplicationConcurrentTime-XX:+PrintGCApplicationStoppedTime
(11)查看每次 minor GC 后新的存活周期的阈值
-XX:+PrintTenuringDistribution
扩展阅读
1. Java Hotspot G1 GC的一些关键技术
https://tech.meituan.com/2016/09/23/g1.html