2009-05-01 19 views
1

我用下面的線來獲得內存使用與Java獲得免費的存儲信息:如何從Java

Free_Memory=Run_Time.freeMemory()/1048576;   // 1024 x 1024 = 1K x 1K = 1Meg 
Total_Memory=Run_Time.totalMemory()/1048576;   // 992 Total on a 4 GB PC 

我得到的Free_Memory:900,但它的路要走,當Free_Memory下降到大約600,我的程序耗盡內存併產生堆溢出消息。所以我看了一下=> Windows任務管理器:性能:物理內存:自由,它降低到1,2或0,這更準確地反映了我的內存情況,根據它,我的總內存是:4089,這是正確的,而Java的Total_Memory = 992是不正確的。

所以,我現在的問題是:在我的Java程序中如何獲取反映在Windows任務管理器中的內存使用數字:性能:物理內存?我需要依靠這些數字。

+2

這些數字不是「不正確的」,他們只是不報告你認爲他們正在報告。 – 2009-05-01 19:12:53

+6

然後幫助他了解他們報告的內容。像這樣的評論太沒用了。 Runtime.freeMemory報告可用於Java VM的內存量,而不是系統本身。 – Chris 2009-05-01 19:16:41

+0

對不起,克里斯範恩。我已經發布了一個答案並將其刪除,然後我認爲至少部分答案可能會有所幫助,因此我發佈了評論。但是當freeMemory()仍然報告600 MB空閒時,我不確定他爲什麼耗盡內存。 – 2009-05-01 19:22:37

回答

2

JVM不允許Java消耗所有可用的系統內存。相反,JVM抓住一個固定的塊並分配該塊內的所有對象。如果這個區域填滿了,你的內存已經不足了!有命令行選項可以替代JVM的最大/初始內存使用情況。

更重要的問題是,你不應該依靠跟蹤空閒/最大內存。你在做什麼,依靠追蹤記憶?

UPDATE:

如果你需要大於1.5GB

更多的內存。如果你想跟蹤內存用完再考慮搞清楚我們爲什麼你的程序做這個,如果它能夠通過防止

嘗試64位不同的算法或更好的管理對象。當記憶達到零時,你期望做什麼?彈出一個對話框,並告訴用戶他們被擰緊並退出程序?我可以理解感謝關機,但警告用戶運行一個大-Xmx不會削減它。

1

如果您需要詳細的Windows統計信息,可以使用WMI和通過cscript.exe執行的.vbs腳本。

This link詳細說明了一個腳本,它比您可能想要的更詳細的記憶狀態。

通過通常的Process/Runtime組合執行此操作,並簡單地回讀您需要的數字。這些是系統級統計信息,而不是虛擬機(儘管WMI也可以撤回每個進程統計信息)。