Mar*_*dik 2 java jvm heap-memory jcmd
我想使用jmap或诊断一些意外的 OOM 错误jcmd。不幸的是,这些工具在 CI 管道中并不容易使用,因为我必须在后台启动 JVM 应用程序,以某种方式获取其 PID,然后获得正确的时间以使结果有用。
因此,我尝试从 JVM 应用程序启动它们,该应用程序将被诊断为 \xe2\x80\x94 程序化自拍。
\n在代码中的适当位置,我启动jmaporjcmd作为一个新进程:
val process = ProcessBuilder("jcmd", getPID(), "GC.class_histogram")\n .redirectOutput(ProcessBuilder.Redirect.PIPE)\n .redirectError(ProcessBuilder.Redirect.PIPE)\n .start()\n\nprocess.waitFor(2, TimeUnit.MINUTES)\nRun Code Online (Sandbox Code Playgroud)\n不幸的是,这两个工具的代码都挂起。系统监视器显示 JVM 应用程序和应用程序都jcmd在休眠。jcmd但是,当我在睡眠 JVM 上使用时:
jcmd 37058 GC.class_histogram\nRun Code Online (Sandbox Code Playgroud)\n我立即得到所需的直方图。
\n知道发生了什么事吗?
\n即使不启动单独的进程,您也可以直接从 Java 应用程序获取直方图:
String histogram = (String) ManagementFactory.getPlatformMBeanServer().invoke(
new ObjectName("com.sun.management:type=DiagnosticCommand"),
"gcClassHistogram",
new Object[]{null},
new String[]{"[Ljava.lang.String;"});
System.out.println(histogram);
Run Code Online (Sandbox Code Playgroud)