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

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

我是不是错过了什么?或者任务控制只打印“重要”gc ?

提前致谢!

最佳答案

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

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

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

关于java - Java Flight Recorder 结果中的垃圾收集统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50401595/

相关文章:

Java 1.7 - CMS 在达到 CMSInitiatingOccupancyFraction 之前启动

jmeter - jmeter(摘要结果)中的错误%是什么意思?

java - 为什么建议将实例变量声明为私有(private)?

java - 如何让 Statement.getGenerateKeys 工作

java - 即使设置了路径变量,SonarQube 也不会在 Windows 上启动

带有内部框架的 Java MVC 和复合设计模式

.net - 无法打开另一个 Excel 文件(当通过 .net 打开一个 Excel 时)

C# - 清理事件处理程序

testing - 使用 Jmeter 和 Blazemeter 对 XMPP 聊天应用程序进行性能测试

ruby-on-rails - 如何设置 RSpec 进行性能测试 'on the side'