gc日志是优化应用程序性能和解决内存问题的重要工具。通过传递“-Xloggc”JVM 参数,可以在特定文件路径中生成垃圾收集日志。
-Xloggc:/home/GCEASY/gc.log
使用这种方法配置gc文件:每当应用程序重新启动时,旧的 GC 日志文件将被新的 GC 日志文件覆盖,因为文件路径相同(即 /home/GCEASY/gc.log)。 因此,您将无法分析在重新启动应用程序之前存在的旧 GC 日志。特别是当应用程序崩溃或出现某些性能问题时,您需要旧的 GC 日志进行分析。
缓解这一挑战的一个简单策略是将新的 GC 日志内容写入不同的文件位置。在本文中,与您分享了 2 种不同的策略:
1、Suffix timestamp to GC Log file
如果您可以在 GC 日志文件后缀 JVM 重新启动的时间戳,那么 GC 日志文件位置将变得唯一。然后新的 GC 日志将不会覆盖旧的 GC 日志。可以通过如下图实现:
"-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/GCEASY/gc-%t.log"
‘%t’ 将时间戳作为 gc 日志文件的后缀,格式为:‘YYYY-MM-DD_HH-MM-SS’。因此生成的 GC 日志文件名将开始类似于:‘gc-2019-01-29_20-41-47.log’
这种方式也有一个小小问题:文件大小增长问题
假设如果您不重新启动 JVM,那么 GC 日志文件的大小可能会增长到巨大的大小。因为在这个策略中,新的 GC 日志文件只会在您重新启动 JVM 时创建。但在我看来这不是主要问题,因为一个 GC 事件只占用几个字节。因此 GC 日志文件大小不会增长到超出大多数应用程序的可管理点。
2、Use -XX:+UseGCLogFileRotation
"-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/GCEASY/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"
当传递“-XX:-UseGCLogFileRotation”时,JVM 本身会启用 GC 日志轮换。
- '-XX:NumberOfGClogFiles' 设置旋转日志时使用的文件数,必须 >= 1。旋转的日志文件将使用以下命名方案,<filename>.0, <filename>.1, …, <filename >.n-1。
- ‘-XX:GCLogFileSize’ 定义日志文件的大小,在该点日志将被轮换,必须 >= 8K
不过这种方式也会有一些小小问题:
1)Losing old GC Logs
假设如果你配置了 -XX:NumberOfGCLogFiles=5 那么在一段时间内,将创建 5 个 GC 日志文件:
gc.log.0 — oldest GC Log content
gc.log.1
gc.log.2
gc.log.3
gc.log.4 — latest GC Log content
最近的 GC 日志内容将写入“gc.log.4”,旧的 GC 日志内容将出现在“gc.log.0”中。
当应用程序开始生成比配置的“-XX:NumberOfGCLogFiles”更多的 GC 日志(在本例中为 5)时,gc.log.0 中的旧 GC 日志内容将被删除。新的 GC 事件将写入 gc.log.0。这意味着您最终将不会拥有所有生成的 GC 日志。
2)Mixed-up GC Logs
假设应用程序创建了 5 个 gc 日志文件,即
gc.log.0
gc.log.1
gc.log.2
gc.log.3
gc.log.4
然后,假设您正在重新启动应用程序。现在新的 GC 日志将写入 gc.log.0 文件,旧的 GC 日志内容将出现在 gc.log.1、gc.log.2、gc.log.3、gc.log.4 中,即
gc.log.0 — GC log file content after restart
gc.log.1 — GC log file content before restart
gc.log.2 — GC log file content before restart
gc.log.3 — GC log file content before restart
gc.log.4 — GC log file content before restart
因此,您的新 GC 日志内容会与旧 GC 日志混淆。为了缓解此问题,您可能必须在重新启动应用程序之前将所有旧的 GC 日志移动到不同的文件夹。
3)通过工具分析日志:
现在要使用 GC 工具(例如(gceasy.io、GCViewer…))分析 GC 日志文件,您必须上传多个 GC 日志文件,而不是只上传一个 GC 日志文件。
ROTATING GC LOG FILES – GC easy – Universal Java GC Log Analyser