如何通过命令行为 jfr 启用堆指标

How to enable heap metrics for jfr via command line

我正在尝试 运行 Java 飞行记录器使用位于 /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/jcmd (Mac OS X).是否有一个命令行选项来启用与 Start Flight Recording UI:

上的 Heap Statistics 选项相对应的堆指标

JDK 17

$ java -XX:StartFlightRecording:jdk.ObjectCount#enabled=true ...

$ jcmd <pid> JFR.start jdk.ObjectCount#enabled=true

JDK 9 - JDK 16

在 JDK 17 之前的 JDK 秒内,没有启用堆统计的命令行或 jcmd 选项。

该事件在默认设置文件和配置文件设置文件中均被禁用​​,因为它会在遍历堆时引入安全点。

但是您可以使用 JMC 中的模板管理器,Windows -> 模板管理器。并检查您想要的设置,即堆统计信息,然后导出文件。然后用jcmd应用它

jcmd <pid> JFR.start settings=my-configuration-file.jfc

如果您正在尝试诊断内存泄漏,可能有兴趣了解 Oracle JDK 10+ 和 OpenJDK 11+ 记录了收集信息的旧对象示例事件通常对于解决 Java 内存泄漏更有用(并且没有安全点开销)。后来 JDKs 有选项 path-to-gc-roots=true (对于 jcmd 和 -XX:StartFlightRecording)可以提供额外的信息来解决内存泄漏。然而,该选项将导致与堆统计信息类似的开销,但比 HPROF 转储的开销要少得多,因为写入磁盘的数据量级较少。

运行 jcmd with settings=profile 使记录包含有关分配的信息。正如其他评论指出的那样,它并不完全对应于堆统计信息,但它可以让您看到 JMC 中的分配火焰图,这正是我来这里寻找的。参见 https://docs.oracle.com/javacomponents/jmc-5-5/jfr-command-reference/diagnostic-command-reference.htm#resourceid-15322-48C8362A

正如其他评论所建议的那样,我在导出模板时遇到了问题。如果你想要堆统计信息,你可以复制 profile.jfc 并按照

中的说明启用它