我们正在监控堆、元空间、线程和gc计数等jvm指标,我们能够将这些指标推送到prometheus等监控服务器上。类似地,我们希望跟踪Java本机内存指标( jcmd VM.sumary的输出)。我的问题是,是否可以通过调用任何jvm运行时类来获得这些指标?
发布于 2019-08-14 06:01:38
是的,可以直接从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);
}
}
不过,您必须解析文本输出。
请注意,可以使用指定的MBeans单独跟踪NMT报告的最重要部分,包括
参见MemoryPoolMXBean和BufferPoolMXBean。
正如我在评论中所说,监视NMT输出在实践中并不总是有帮助的,因为它不能直接反映进程使用的实际物理内存。NMT可以报告比实际使用情况更多的much less内存,也可以报告比操作系统所消耗的进程更多的more内存。
由于NMT可以忽略Java进程消耗的大量OS内存,因此监视进程的驻留集大小(RSS)也很有用。在Linux上,这可以通过解析/proc/[pid]/stat
或/proc/[pid]/status
来完成。
发布于 2019-08-12 17:32:56
你可以在JMX中找到很多你想要的东西。问题“为什么要使用JMX技术?”是“监视和管理Java VM”。在Oracle doc中
JMX Java Virtual Machine (Java )使用
技术进行了高度的检测。您可以启动JMX代理来访问内置的Java工具,从而远程地对Java进行监视和管理。
//Metaspace
for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
if ("Metaspace".equals(memoryMXBean.getName())) {
System.out.println(memoryMXBean.getUsage().getUsed());
System.out.println(memoryMXBean.getUsage().getCommitted());
System.out.println(memoryMXBean.getUsage().getMax());
System.out.println(memoryMXBean.getUsage().getInit());
}
}
//current number of live threads including both daemon and non-daemon threads
int threadCount = ManagementFactory.getThreadMXBean().getThreadCount();
//Returns the current memory usage of the heap and non-heap
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapMemory = memoryMXBean.getHeapMemoryUsage();
MemoryUsage nonHeapMemory = memoryMXBean.getNonHeapMemoryUsage();
//GarbageCollector total number of collections
List<GarbageCollectorMXBean> garbageCollectorMXBeans = ManagementFactory.getGarbageCollectorMXBeans();
long totalCollectionCount = garbageCollectorMXBeans.stream().mapToLong(x -> x.getCollectionCount()).sum();
发布于 2019-08-12 12:27:53
我不认为有Java API可以做到这一点。最好的方法可能是调用jcmd <PID> VM.native_memory
命令并解析其输出。当然,您需要首先为您的进程启用本机内存跟踪。
https://stackoverflow.com/questions/57455262
复制相似问题