我们在 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 ?
提前致谢!