知识库

如何启用 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 选项来激活,也可以通过对运行中的 Java 应用程序使用 jcmd 工具来激活。可用的命令和选项将取决于基于 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 进程 ID(例如 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 和 5.x 的 JDK 版本中不使用,而是可以使用 name=。)

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

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

image