3 回答

TA貢獻1801條經驗 獲得超16個贊
注意:到目前為止,所有答案,甚至是已接受的答案,似乎都在回答這個問題,說這Runtime.getRuntime().freeMemory()將為您提供可能分配的內存量,直到發生內存不足錯誤為止。但是:這是錯誤的。
直到出現內存不足錯誤(即可能有空閑內存)之前可以分配的大概內存量
long presumableFreeMemory = Runtime.getRuntime().maxMemory() - allocatedMemory;
哪里
long allocatedMemory = (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory());
說明: 如果通過-mx參數(或-Xmx)啟動JVM,則指定可用于JVM的最大數量。Runtime.getRuntime().maxMemory()會給你這筆錢。JVM將從此系統內存量中分塊分配內存,例如64 mb的塊。在開始時,JVM只會從系統中分配這樣的塊,而不是全部。Runtime.getRuntime().totalMemory()給出了系統分配的總內存,同時Runtime.getRuntime().freeMemory()為您提供免費的內存中分配的內存總量。
因此:
long definitelyFreeMemory = Runtime.getRuntime().freeMemory();
是JVM已經保留的可用內存,但是可能只有少量。而且您可能會得到presumableFreeMemory。當然,即使您嘗試分配的大小小于,也可能會遇到內存不足的異常presumableFreeMemory。如果JVM無法從系統中獲取下一個內存塊,則可能會發生這種情況。但是,在大多數系統上,這種情況永遠不會發生,并且系統寧愿開始交換-您希望避免這種情況。原始問題的答案:如果-mx設置為合理的值,那么它presumableFreeMemory是空閑內存的良好指示。
添加回答
舉報