首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >监视java本机内存

监视java本机内存
EN

Stack Overflow用户
提问于 2019-08-12 11:10:54
回答 4查看 2.6K关注 0票数 4

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

EN

回答 4

Stack Overflow用户

发布于 2019-08-14 06:01:38

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

代码语言:javascript
运行
复制
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报告的最重要部分,包括

  • Java Heap
  • 代码类空间
  • 直接字节缓冲区和映射字节缓冲区

参见MemoryPoolMXBeanBufferPoolMXBean

正如我在评论中所说,监视NMT输出在实践中并不总是有帮助的,因为它不能直接反映进程使用的实际物理内存。NMT可以报告比实际使用情况更多的much less内存,也可以报告比操作系统所消耗的进程更多的more内存。

由于NMT可以忽略Java进程消耗的大量OS内存,因此监视进程的驻留集大小(RSS)也很有用。在Linux上,这可以通过解析/proc/[pid]/stat/proc/[pid]/status来完成。

票数 6
EN

Stack Overflow用户

发布于 2019-08-12 17:32:56

你可以在JMX中找到很多你想要的东西。问题“为什么要使用JMX技术?”是“监视和管理Java VM”。在Oracle doc

JMX Java Virtual Machine (Java )使用

技术进行了高度的检测。您可以启动JMX代理来访问内置的Java工具,从而远程地对Java进行监视和管理。

代码语言:javascript
运行
复制
//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();
票数 1
EN

Stack Overflow用户

发布于 2019-08-12 12:27:53

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57455262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档