Java Flight Recorder结果中的垃圾收集统计信息

时间:2018-05-17 22:59:23

标签: java garbage-collection performance-testing jfr java-mission-control

我们在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 log&生成安全点日志文件。 但是,我注意到任务控制中的GC统计信息没有列出在应用程序生命周期中发生的所有GC。例如。如果我使用GCViewer(https://github.com/chewiebug/GCViewer)打开gc日志,则会发生更多的GC。

我错过了什么吗?或者任务控制只打印"重要" gc?

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

我注意到您使用的是自定义JFC文件,是否已禁用某些GC事件,例如年轻的收藏?

您可能需要考虑将录制内容写入磁盘(disk = true)并设置maxage = 1h(或您需要的内容)以确保不会刷新旧事件。