与大多数工程师的想法相反,垃圾收集对应用程序的影响更为深远。为了优化内存和垃圾收集设置并解决与内存相关的问题,必须分析垃圾收集日志。
启用 GC 日志
GC Logging 可以通过在应用程序启动期间传递下面提到的系统属性来启用
直到 Java 8:
以下是 JDK 8 之前所有 Java 版本都支持的系统属性。
-XX:+PrintGCDetails -Xloggc:<gc-log-file-path>
例子:
-XX:+PrintGCDetails -Xloggc:/opt/tmp/myapp-gc.log
从 Java 9:
以下是从 JDK 9 开始的所有 Java 版本都支持的系统属性。
-Xlog:gc*:file=<gc-log-file-path>
例子:
-Xlog:gc*:file=/opt/tmp/myapp-gc.log
如何分析GC日志?
这是传递上述系统属性时生成的示例 GC 日志:
GC日志信息丰富,但是理解GC日志并不容易。没有足够的文档来解释 GC 日志格式。最重要的是,GC 日志格式没有标准化。它因 JVM 供应商(Oracle、IBM、HP、Azul 等)、Java 版本(1.4、5、6、7、8、9)、GC 算法(串行、并行、CMS、G1、Shenandoah)、GC 系统属性而异你通过 (-XX:+PrintGC
, -XX:+PrintGCDetails
, -XX:+PrintGCDateStamps
, -XX:+PrintHeapAtGC
...)。基于这种排列组合,很容易就有 60 多种不同的 GC 日志格式。
因此,在分析GC日志时,强烈推荐使用GCeasy
、HPJmeter
等GC日志分析工具。这些工具解析 GC 日志并生成出色的数据图形可视化、报告关键性能指标和其他一些有用的指标。