我们在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?
提前致谢!
答案 0 :(得分:1)
JFR使用环形缓冲区,因此在某些时候,旧的GC的事件会被刷新,但是你不应该有间隙。
我注意到您使用的是自定义JFC文件,是否已禁用某些GC事件,例如年轻的收藏?
您可能需要考虑将录制内容写入磁盘(disk = true)并设置maxage = 1h(或您需要的内容)以确保不会刷新旧事件。