如何从同一个 JVM 应用程序创建 JVM 应用程序的类直方图?

Mar*_*dik 2 java jvm heap-memory jcmd

我想使用jmap或诊断一些意外的 OOM 错误jcmd。不幸的是,这些工具在 CI 管道中并不容易使用,因为我必须在后台启动 JVM 应用程序,以某种方式获取其 PID,然后获得正确的时间以使结果有用。

\n

因此,我尝试从 JVM 应用程序启动它们,该应用程序将被诊断为 \xe2\x80\x94 程序化自拍。

\n

在代码中的适当位置,我启动jmaporjcmd作为一个新进程:

\n
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)\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,这两个工具的代码都挂起。系统监视器显示 JVM 应用程序和应用程序都jcmd在休眠。jcmd但是,当我在睡眠 JVM 上使用时:

\n
jcmd 37058 GC.class_histogram\n
Run Code Online (Sandbox Code Playgroud)\n

我立即得到所需的直方图。

\n

知道发生了什么事吗?

\n

apa*_*gin 6

即使不启动单独的进程,您也可以直接从 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)