Uda*_*kar 4 java monitoring jvm prometheus jcmd
我们正在监控 jvm 指标,如堆、元空间、线程和 gc 计数,我们能够将这些指标推送到监控服务器,如 prometheus。类似地,我们想跟踪 Java 本机内存指标(jcmd VM.sumary 的输出)。我的问题是,是否可以通过调用任何 jvm 运行时类来获取这些指标?
是的,可以直接从 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 报告中最重要的部分,包括
请参阅MemoryPoolMXBean和BufferPoolMXBean。
正如我在评论中所说,监视 NMT 输出在实践中并不总是有帮助,因为它不直接反映进程使用的实际物理内存。NMT可以报告要少得多比实际使用的内存,或者它也可以报告更比从操作系统的角度进程占用内存。
由于 NMT 可能会错过 Java 进程消耗的大量操作系统内存,因此监视进程的驻留集大小 (RSS) 也很有用。在 Linux 上,这可以通过解析/proc/[pid]/stat或/proc/[pid]/status.
我认为没有 Java API 可以实现这一点。您最好的选择可能是调用该jcmd <PID> VM.native_memory命令并解析其输出。当然,您需要首先为您的进程启用本机内存跟踪。
| 归档时间: |
|
| 查看次数: |
2270 次 |
| 最近记录: |