2012-04-26 35 views
1

我想計算我的Java應用程序的當前內存使用情況。但是,當我使用以下代碼時,與任務管理器中顯示的內容有很大差異。Java:計算內存使用率時的結果不準確

Runtime rt = Runtime.getRuntime(); 
long usedMemory = (rt.totalMemory() - rt.freeMemory())/1024; 

根據任務管理器,當進程消耗3.000.000K時,該代碼將例如,計算2.015.203和1秒後1.712.296,實際上內存使用量增加了。

根據類似的問題,代碼應該沒問題,但爲什麼與任務管理器相比有如此巨大的差別?

+0

JVisualVM報告是什麼 - 它與TaskManager有什麼不同? – 2012-04-26 23:46:59

+0

你在任務管理器中查看了哪些列?有很多內存列。 – 2012-04-26 23:49:50

+0

你爲什麼想知道?這不是一個輕浮的問題。 Java是一個高度複雜的託管環境,在幾乎所有情況下,您都不應該通過詢問操作系統來嘗試爲其制定流程管理決策。 – kittylyst 2012-04-27 03:12:18

回答

6

TaskManager會告訴您java進程(JVM)的所有可用內存。

在內部,JVM根據程序需求來管理此內存(所以,JVM中有「空閒」的內存,但它顯示爲用於TaskMan)。

此外,GC在決定最有用時釋放內存。因此,在創建更多對象之後很有可能使用的內存更少,因爲GC已經掃過先前分配的內存(但無法訪問)。