你如何知道JVM剩下多少內存?如何找到分配對象的剩餘內存量?
我知道Runtime.getRuntime()。freeMemory()是要走的路,但它似乎沒有返回合理的值。例如,當我運行我的主要方法時,我打印空閒內存並獲得78904576字節,這隻有75兆字節。由於我的maxMemory設置爲2千兆字節,看起來不合理。
老實說,我只是想知道我有多接近用完內存,所以提供替代機制的答案也是可以接受的。
你如何知道JVM剩下多少內存?如何找到分配對象的剩餘內存量?
我知道Runtime.getRuntime()。freeMemory()是要走的路,但它似乎沒有返回合理的值。例如,當我運行我的主要方法時,我打印空閒內存並獲得78904576字節,這隻有75兆字節。由於我的maxMemory設置爲2千兆字節,看起來不合理。
老實說,我只是想知道我有多接近用完內存,所以提供替代機制的答案也是可以接受的。
這是公式
long availableMemory = Runtime.getRuntime().freeMemory() + (Runtime.getRuntime().maxMemory() - Runtime.getRuntime().totalMemory())
freeMemory()只顯示與當前分配的內存可用內存,讓所有可用內存,我們還必須包括其尚未分配尚未內存。
另一種解決方案
MemoryUsage mu = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
long availableMemory = mu.getMax() - mu.getUsed();
很想知道你到底需要這個。如果您關心內存消耗並擔心OOM錯誤,則可以將某些(大)對象定義爲「SoftReference」,如果應用程序內存不足,則其內存空間將被釋放 - 這對緩存的值或數據而言是理想的解決方案。 –
對剩餘存儲量具有良好估計的算法(以及將該值轉換爲相關參數的良好功能)可以基於該信息自行調整:即基於知道可用空間而做出時間與空間折衷。 – Kaz
@RomanVottner我在討論線程問題,我想寫一個ExecutorService,當一定量的內存空閒時,它只啓動新線程。 – Others