3 回答

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