当尝试通过以下代码监控我自己的程序的内存使用情况时
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/