2011-11-22 102 views
2

我檢查的運行時間,堆內存使用情況和不同的算法,以特定的排序問題的非堆內存的使用情況。的Java:檢查非堆內存使用量

我已經成功了能夠測量運行時間和堆內存使用情況,但我有問題,測量非堆內存的使用情況。

我做什麼,當我試圖測量它是我開始一個新的線程,如果非堆內存已經改變了其持續不斷地檢查,而我跑我的排序算法。此線程對象記錄該算法運行期間內存使用率的最高值。

這適用於普通的堆內存(或者至少,我認爲它可以工作,因爲它提供了邏輯結果),但是當我嘗試對非堆內存執行相同的操作時,我會獲得大量的0內存使用結果。我使用ManagementFactory.memoryMXBean.getNonHeapMemoryUsage()。getUsed()來讀取非堆內存,我認爲這個內存在運行垃圾收集器時沒有被釋放(我運行System.gc()16次,希望能夠垃圾收集器收集垃圾之前,我記錄下初始內存(我知道這僅僅是一個建議,但是這不應該的問題,因爲它不會做非堆內存什麼反正(我認爲)))。我也猜測,當從堆棧中彈出事件時,這個內存不會被釋放,因爲我的結果在第一個算法嘗試中是最大的,因此我懷疑我只得到每次運行之間的非堆內存使用情況的差異,如果0後者運行使用的內存少於前者。

這是我記憶中檢查類:

class MemoryInspectorThread extends Thread 
{ 
private int samplingInterval; 

private long initialMemoryHeap; 
private long initialMemoryNonHeap; 
private long maxMemoryHeap; 
private long maxMemoryNonHeap; 

private boolean kill=false; 

void kill() 
{ 
    kill=true; 
} 

long getMaxNewMemoryHeap() 
{ 
    return (maxMemoryHeap-initialMemoryHeap)/1024; 
} 

long getMaxNewMemoryNonHeap() 
{ 
    return (maxMemoryNonHeap-initialMemoryNonHeap)/1024; 
} 

MemoryInspectorThread(int samplingInterval) 
{ 
    this.samplingInterval=samplingInterval; 

    try 
    { 
     sleep(1000); 
    } catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 

    MemoryMXBean memoryMXBean=ManagementFactory.getMemoryMXBean(); 

    System.gc(); System.gc(); System.gc(); System.gc(); 
    System.gc(); System.gc(); System.gc(); System.gc(); 
    System.gc(); System.gc(); System.gc(); System.gc(); 
    System.gc(); System.gc(); System.gc(); System.gc(); 

    initialMemoryHeap=memoryMXBean.getHeapMemoryUsage().getUsed(); 
    initialMemoryNonHeap=memoryMXBean.getNonHeapMemoryUsage().getUsed(); 
} 
@Override 
public void run() 
{ 
    MemoryMXBean memoryMXBean=ManagementFactory.getMemoryMXBean(); 

    while (!kill) 
    { 
     long freeMemoryHeap=memoryMXBean.getHeapMemoryUsage().getUsed(); 
     long freeMemoryNonHeap=memoryMXBean.getNonHeapMemoryUsage().getUsed(); 

     if (freeMemoryHeap > maxMemoryHeap) 
     { 
      maxMemoryHeap=freeMemoryHeap; 
     } 

     if (freeMemoryNonHeap > maxMemoryNonHeap) 
     { 
      maxMemoryNonHeap=freeMemoryNonHeap; 
     } 

     try 
     { 
      sleep(samplingInterval); 
     } catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
} 

我怎樣才能得到實際的非堆內存?我對這件事情是如何運作的假設是正確的?

回答

3

你可以嘗試使用SOM外部工具像VisualVMJConsole。我認爲他們會讓你更清楚地瞭解虛擬機中正在發生的事情。

+0

是的,這解決了我的問題。謝謝!你對我爲什麼memoryMXBean函數不能給出非堆內存的假設有什麼想法?他們是否正確? – nijoakim