2013-02-20 67 views
2

當試圖通過下面的代碼通過getMemoryMXBean()和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在我的程序VS在jvisualvm 18 639 640)看到。我知道這不是什麼大問題,但它確實讓我思考。

這個事實有什麼解釋嗎?

如果可能,我想使用編碼版本,但如果結果有某種偏斜,jvisualvm在某種程度上更可信,我將不得不堅持使用jvisualvm。

感謝

+2

我想知道jvisualvm是否將堆和非堆內存使用情況加起來以獲得其編號。嘗試在你的應用中添加它們,看看你是否接近。 – 2013-02-24 20:11:00

回答

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版本等的其他信息,以便跟蹤此問題。

相關問題