知识库

如何启用 Java Flight Recorder 并查看结果

Java Flight Recorder 可用于捕获 Java 进程(例如 Neo4j)的低级 Java 属性和运行时数据。

The Java Flight Recorder (JFR) is a commercial feature. You can use it for free on developer desktops/laptops, and for
evaluation purposes in test, development, and production environments. However, to enable JFR on a production server,
you require a commercial license. Using JMC UI for other purposes on the JDK does not require a commercial license.

JFR 可以通过在启动时在 Java 应用程序中配置 JVM 选项或使用 jcmd 工具来为正在运行的 Java 应用程序激活。 可用的命令和选项将取决于基于 Neo4j 版本的使用的支持的 JVM。 JMC 文档 此处 链接到各种 JDK 版本的文档示例,当需要额外选项时可能会有所帮助。

为了在 Neo4j 服务启动时启用 Java Flight Recorder,应将以下 JVM 选项添加到 neo4j.conf 中,然后需要重新启动 Neo4j 以使这些更改生效。 稍后讨论的 JFR.dump 命令可用于在启用后转储内容。

对于 3.x

dbms.jvm.additional=-XX:+UnlockCommercialFeatures
dbms.jvm.additional=-XX:+FlightRecorder
dbms.jvm.additional=-XX:FlightRecorderOptions=defaultrecording=true,settings=profile

对于 4.x

dbms.jvm.additional=-XX:StartFlightRecording=settings=profile

对于 5.x

server.jvm.additional=-XX:StartFlightRecording=settings=profile

要开始基于时间的录制,在命令行中运行

$ $JAVA_HOME/jcmd <pid> JFR.start duration=3600s filename=myrecording.jfr settings=/usr/lib/jvm/java-8-oracle/jre/lib/jfr/profile.jfc

将 <pid> 替换为 Neo4j 进程的 Linux pid(即 ps -eaf | grep java)。

包含 duration=3600s,应该会生成一个持续 1 小时的录制,并且该文件将在 1 小时运行完成后写入。

上面提到的对 filename=myrecording.jfr 的引用描述了要生成的输出文件。 当未定义路径时,生成的文件将记录在 $NEO4J_HOME 中。 或者,可以将带完整路径引用的文件名定义为 filename=/tmp/myrecording.jfr

此外,profile.jfc 的位置可能在您给定安装的目录/路径中不同。 预期路径位于 $JRE_HOME/lib/jfr 中。

如果您不知道要运行录制的时长,因为问题可能是间歇性的,请运行

$ $JAVA_HOME/jcmd <pid> JFR.start settings=/usr/lib/jvm/java-8-oracle/jre/lib/jfr/profile.jfc

这将报告

3962:
Started recording 1. No limit (duration/maxsize/maxage) in use.

Use JFR.dump recording=1 filename=FILEPATH to copy recording data to file.

然后将录制转储到文件,请运行

$ jcmd <pid> JFR.dump recording=<recording #> filename=<filename>

然后完全停止录制,尽管这不会将录制内容转储到文件,请运行

$ jcmd <pid> JFR.stop recording=<recording #>

(注意:上面命令中的 recording= 选项没有在 Neo4j 4.x 和 5x 的 JDK 版本中使用,而是可以使用 name=)。

要查看结果,请启动 Java Mission Control($JAVA/HOME/jmc)。 这将启动一个 Java 应用程序,如下所述。 请注意,如果您通过 Putty 或 Telnet 客户端连接,则可能无法启动。 作为替代方案,可以使用 MobaXterm

可以使用 Java Mission Control 分析生成的 Java Flight Recorder 文件。 要启动 Java Mission Control,请运行 $JAVA_HOME/jmc。 启动后,使用菜单“文件”/“打开文件”,然后可以浏览到 Flight Recorder 文件。

image