2

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

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在我的程序中与18 639 640在 jvisualvm 中)。我知道这没什么大不了的,但它确实让我思考。

这个事实有什么解释吗?

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

谢谢

4

1 回答 1

3

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 版本等的附加信息以跟踪此问题。

于 2013-02-27T12:19:42.593 回答