java - 通过 getMemoryMXBean() 和 jvisualvm 获得的内存使用量之间存在差异吗?

标签 java profiling mbeans jvisualvm

当尝试通过以下代码监控我自己的程序的内存使用情况时

public static String heapMemUsage() 
{
    long used = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed();
    long max = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getMax();
    return ""+used+" of "+max+" ("+ used/(double)max*100.0 + "%)";
}

我得到的结果与通过 jvisualvm 看到的结果略有不同(我的程序中的 17 588 616 与 jvisualvm 中的 18 639 640)。我知道这没什么大不了的,但这确实让我思考。

这个事实有什么解释吗?

如果可能的话,我想使用编码版本,但如果它的结果​​在某种程度上有偏差,jvisualvm 在某种程度上更可信,我将不得不坚持使用 jvisualvm。

谢谢

最佳答案

VisualVM 确实使用相同的方法来获取所需的值,让我们检查 MonitoredDataImpl.java :

MonitoredDataImpl(Jvm vm,JmxSupport jmxSupport,JvmMXBeans jmxModel) {
    //...
    MemoryUsage mem = jmxModel.getMemoryMXBean().getHeapMemoryUsage();
    MemoryPoolMXBean permBean = jmxSupport.getPermGenPool();    
    //...
    genCapacity = new long[2];
    genUsed = new long[2];
    genMaxCapacity = new long[2];
    genCapacity[0] = mem.getCommitted();
    genUsed[0] = mem.getUsed();

    genMaxCapacity[0] = mem.getMax();

    if (permBean != null) {
        MemoryUsage perm = permBean.getUsage();
        genCapacity[1] = perm.getCommitted();
        genUsed[1] = perm.getUsed();
        genMaxCapacity[1] = perm.getMax();
    }
  }

所以无论如何使用你的方法都是安全的。请发布有关 JVM 版本等的附加信息,以便追踪此问题。

关于java - 通过 getMemoryMXBean() 和 jvisualvm 获得的内存使用量之间存在差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14989476/

相关文章:

java - 使用具有临时端口的 JMX 服务器时,如何获取服务器端口号?

java - init.gradle 从命令行读取属性

java - Apache POI生成文档并在内部排序

Android Profiling 对所选进程不可用,但已启用高级分析

linux - 使用 perf 监控原始事件计数器

java - 如何以编程方式检查 JMX MBean 操作和属性?

java - 在 Java 中创建 MBean

java - JAXB/MOXy : Do not call XmlElementWrapper setter when element missing?

java - 在 Java 中创建非常简单的 Web 服务时出现运行时建模器错误

python - 为什么在 python 中使用指数取模更快?