使用 Flight Recorder 和 JDK Mission Control 计算更多方法

Posted

技术标签:

【中文标题】使用 Flight Recorder 和 JDK Mission Control 计算更多方法【英文标题】:Take more method count with Flight Recorder and JDK Mission Control 【发布时间】:2020-12-09 12:43:27 【问题描述】:

背景

我正在尝试使用 Flight Recorder 检查我的 Java 批处理应用程序以提高启动性能。现在启动大约需要 20 秒,而我正在努力使其少于 10 秒。

该应用程序是使用 Spring Boot 2.2 和 Spring Batch 构建的,并在 JDK 11 上运行。我使用的是 Flight Recorder 而不是 VisualVM,因为 JDK 11 不包含开箱即用的 VisualVM(在检查环境中安装其他工具是并非不可能,但受到限制)。

问题

我认为我可以使用 Flight Recoder 检查启动过程,所以我运行了这样的应用程序:

java -XX:StartFlightRecording=filename=demo.jfr,settings=profile -jar .\build\libs\demo-0.0.1-SNAPSHOT.jar -spring.batch.job.names importUserJob -spring.batch.job.enabled false

但 Mission Control 在“方法分析”面板中仅显示约 100 个计数。了解整个启动过程的趋势并检查哪个方法在该过程中花费的时间最多,这太少了。

问题

如何使用 Flight Recorder 和 JDK Mission Control 获取更多方法计数? .jfc 文件中的哪个参数会影响方法计数的数量?

【问题讨论】:

【参考方案1】:

如果您运行的是 JDK 13 或更高版本,则可以将采样模式设置为“Ludicrous”。

它将每毫秒对线程进行一次采样。您可以进入 Window -> Template Manager 并为 Method Profiling 选择“Ludicrous”模式,然后导出 .jfc 文件并使用它启动您的应用程序:

 $ java -XX:StartFlightRecording:settings=/settings/my.jfc ...

或者您可以进入 JAVA_HOME/lib/jfr/ 并将 default.jfc 复制到一个新文件并编辑其中显示 jdk.ExecutionSample 的时间段。您可以设置的最小值为 1 毫秒。

会增加开销,但您会获得更多样本。

【讨论】:

以上是关于使用 Flight Recorder 和 JDK Mission Control 计算更多方法的主要内容,如果未能解决你的问题,请参考以下文章

jdk11新特性——Java Flight Recorder

Java Flight Recorder - Live Objects 选项卡为空

内置 JFR(Java Flight Recorder)事件记录在哪里?

Java Mission Control Flight Recorder 中没有记录 CPU 使用情况

JMC Java Flight Recorder 未启用

Java Flight Recorder - 查找文件描述符泄漏