0

我们在 CI 中有一项工作,它启动我们的 Java 应用程序并运行一些测试(测试充当应用程序的客户端)。该应用程序以我认为正确的 JVM 选项开始,以进行连续飞行记录:

-XX:+UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -XX:+FlightRecorder -XX:FlightRecorderOptions=dumponexit=true,dumponexitpath=/tmp/application-flightRecorder.jfr -XX:StartFlightRecording=defaultrecording=true,settings=customSetting -XX:+DebugNonSafepoints

它可以很好地生成 JFR 文件,我可以在 Java Mission Control 中打开它。除了上面的 JVM 选项,我们还可以选择启用 GC 日志记录:

-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintFlagsFinal -XX:+PrintHeapAtGC -XX:+PrintReferenceGC -XX:+PrintTenuringDistribution -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+LogVMOutput -XX:LogFile=/tmp/application-safepoint.log -Xloggc:/tmp/application-gc.log

这也很好。生成 gc 日志和安全点日志文件。但是,我注意到任务控制中的 GC 统计信息并未列出在应用程序生命周期内发生的所有 GC。例如,如果我使用 GCViewer ( https://github.com/chewiebug/GCViewer ) 打开 gc 日志,则会发生更多的 GC。

我在这里错过了什么吗?还是任务控制只打印“重要” gc ?

提前致谢!

4

1 回答 1

1

JFR 使用环形缓冲区,因此在某些时候旧 GC 的事件会被清除,但您不应该有间隙。

我注意到您使用了自定义 JFC 文件,可能是您禁用了一些 GC 事件,例如年轻集合?

您可能需要考虑将记录写入磁盘 (disk=true) 并设置 maxage=1h(或您需要的)以确保旧事件不会被清除。

于 2018-05-19T22:50:32.767 回答