监控java本机内存

Uda*_*kar 4 java monitoring jvm prometheus jcmd

我们正在监控 jvm 指标,如堆、元空间、线程和 gc 计数,我们能够将这些指标推送到监控服务器,如 prometheus。类似地,我们想跟踪 Java 本机内存指标(jcmd VM.sumary 的输出)。我的问题是,是否可以通过调用任何 jvm 运行时类来获取这些指标?

apa*_*gin 5

是的,可以直接从 Java 应用程序获取 NativeMemoryTracking 摘要:

import javax.management.JMException;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;

public class DiagnosticCommand {

    public static String execute(String command, String... args) throws JMException {
        return (String) ManagementFactory.getPlatformMBeanServer().invoke(
                new ObjectName("com.sun.management:type=DiagnosticCommand"),
                command,
                new Object[]{args},
                new String[]{"[Ljava.lang.String;"});
    }

    public static void main(String[] args) throws Exception {
        String summary = DiagnosticCommand.execute("vmNativeMemory", "summary");
        System.out.println(summary);
    }
}
Run Code Online (Sandbox Code Playgroud)

不过,您必须解析文本输出。

请注意,可以使用指定的 MBean 单独跟踪 NMT 报告中最重要的部分,包括

  • Java堆
  • 代码缓存
  • 元空间
  • 压缩类空间
  • 直接字节缓冲区和映射字节缓冲区

请参阅MemoryPoolMXBeanBufferPoolMXBean

正如我在评论中所说,监视 NMT 输出在实践中并不总是有帮助,因为它不直接反映进程使用的实际物理内存。NMT可以报告要少得多比实际使用的内存,或者它也可以报告比从操作系统的角度进程占用内存。

由于 NMT 可能会错过 Java 进程消耗的大量操作系统内存,因此监视进程的驻留集大小 (RSS) 也很有用。在 Linux 上,这可以通过解析/proc/[pid]/stat/proc/[pid]/status.


Jur*_*nka 1

我认为没有 Java API 可以实现这一点。您最好的选择可能是调用该jcmd <PID> VM.native_memory命令并解析其输出。当然,您需要首先为您的进程启用本机内存跟踪。