2014-01-28 73 views
1

你如何知道JVM剩下多少內存?如何找到分配對象的剩餘內存量?

我知道Runtime.getRuntime()。freeMemory()是要走的路,但它似乎沒有返回合理的值。例如,當我運行我的主要方法時,我打印空閒內存並獲得78904576字節,這隻有75兆字節。由於我的maxMemory設置爲2千兆字節,看起來不合理。

老實說,我只是想知道我有多接近用完內存,所以提供替代機制的答案也是可以接受的。

+0

很想知道你到底需要這個。如果您關心內存消耗並擔心OOM錯誤,則可以將某些(大)對象定義爲「SoftReference」,如果應用程序內存不足,則其內存空間將被釋放 - 這對緩存的值或數據而言是理想的解決方案。 –

+0

對剩餘存儲量具有良好估計的算法(以及將該值轉換爲相關參數的良好功能)可以基於該信息自行調整:即基於知道可用空間而做出時間與空間折衷。 – Kaz

+0

@RomanVottner我在討論線程問題,我想寫一個ExecutorService,當一定量的內存空閒時,它只啓動新線程。 – Others

回答

2

這是公式

long availableMemory = Runtime.getRuntime().freeMemory() + (Runtime.getRuntime().maxMemory() - Runtime.getRuntime().totalMemory()) 

freeMemory()只顯示與當前分配的內存可用內存,讓所有可用內存,我們還必須包括其尚未分配尚未內存。

另一種解決方案

MemoryUsage mu = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); 
    long availableMemory = mu.getMax() - mu.getUsed(); 
+0

完美但是,你介意添加一些解釋嗎? – Others

+1

@Gregor爲什麼不[自己想想](http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html) - 你將獲得更多的經驗和知識,而不僅僅是複製/粘貼其他解決方案 –

+1

@RomanVottner爲什麼我們需要一個問答網站,如果每個人都可以爲自己弄明白。人們有時會來剪裁和粘貼解決方案。 – Kaz

0

如果你真的想監視JVM內存,你最好使用諸如YourKit或JProfilier這樣的分析工具。

+0

我寧可不使用外部工具。我只是希望能夠通過編程快速檢查剩餘多少內存。 – Others