我檢查的運行時間,堆內存使用情況和不同的算法,以特定的排序問題的非堆內存的使用情況。的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();
}
}
}
}
我怎樣才能得到實際的非堆內存?我對這件事情是如何運作的假設是正確的?
是的,這解決了我的問題。謝謝!你對我爲什麼memoryMXBean函數不能給出非堆內存的假設有什麼想法?他們是否正確? – nijoakim