Java 诊断命令 (jcmd) 与 Native Image

Native Image 现已支持 Java 诊断命令 (jcmd),使用户能够使用与 Java 应用程序相同的 jcmd 工具与原生可执行文件交互。此支持补充了现有的 Native Image 监控功能,包括 JDK Flight Recorder、堆转储和原生内存跟踪。

启用 jcmd 支持 #

jcmd 支持默认禁用,必须在构建时显式启用。

使用 --enable-monitoring=jcmd 选项构建启用 jcmd 的原生可执行文件。

native-image --enable-monitoring=jcmd YourApplication

启用 jcmd 支持时,您可能还希望包含其他监控功能,例如 JDK Flight Recorder 或堆转储。在 Native Image 构建过程中包含多个监控功能可以解锁在运行时访问更多诊断命令。例如

native-image --enable-monitoring=jcmd,jfr,heapdump YourApplication

要在运行时使用 jcmd,请照常启动您的原生可执行文件并获取其进程 ID (PID)。有了 PID,您可以使用 jcmd 连接到正在运行的原生应用程序。例如,要列出特定可执行文件的可用命令,请运行:jcmd <pid> help

jcmd 388454 help

388454:
The following commands are available:
GC.heap_dump
GC.run
JFR.start
JFR.stop
JFR.check
JFR.dump
Thread.dump_to_file
Thread.print
VM.command_line
VM.native_memory
VM.system_properties
VM.uptime
VM.version
help

For more information about a specific command use 'help <command>'.

您可能会发现同时启用 jvmstat 监控功能很有用,这样您的原生可执行文件就可以通过 jcmd -l 或不带任何参数的 jcmd 命令被发现和列出。

native-image --enable-monitoring=jcmd,jvmstat YourApplication
jcmd -l
1455557 YourApplication
1455667 jdk.jcmd/sun.tools.jcmd.JCmd -l

支持的诊断命令 #

支持以下键值对:

名称 包含在 --enable-monitoring= 描述
Compiler.dump_code_cache 仅在使用 Truffle 运行时编译时可用 打印代码缓存中所有已编译方法的信息。
GC.heap_dump heapdump 生成 Java 堆的 HPROF 格式转储。
GC.run 始终可用 调用 java.lang.System.gc()
JFR.start jfr 启动新的 JFR 录制。
JFR.stop jfr 停止 JFR 录制。
JFR.check jfr 检查正在运行的 JFR 录制。
JFR.dump jfr 将 JFR 录制内容复制到文件。必须指定名称或录制 ID。
Thread.dump_to_file 始终可用 将带有堆栈跟踪的线程转储到纯文本或 JSON 格式的文件中。
Thread.print 始终可用 打印所有带有堆栈跟踪的线程。
VM.command_line 始终可用 打印用于启动此 VM 实例的命令行。
VM.native_memory nmt 打印原生内存使用情况。
VM.system_properties 始终可用 打印系统属性。
VM.uptime 始终可用 打印 VM 运行时长。
VM.version 始终可用 打印 JVM 版本信息。
help 始终可用 显示帮助信息。

性能 #

为 Native Image 添加 jcmd 支持对应用程序空闲时的性能影响很小。然而,性能影响因使用的诊断命令及其调用频率而异。例如,触发多次垃圾回收将比转储单个原生内存跟踪报告产生更大的开销。您可以使用 jcmd <pid> help <command> 打印特定命令的帮助信息,其中也列出了其预期的性能影响。

限制 #

目前,此功能在 Windows 上不可用。

延伸阅读 #

联系我们