亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java獲取可用內存

Java獲取可用內存

紫衣仙女 2019-11-12 14:55:42
有什么好的方法可以在運行時將剩余的內存提供給JVM?這種情況的用例是使Web服務在接近內存限制時通過拒絕一個新的錯誤消息“太多的人使用此,請稍后再試”,而不是由于OutOfMemory錯誤而突然死亡,從而在它們接近內存限制時優雅地失敗。 。注意,這與事先計算/估算每個對象的成本無關。原則上,我可以根據該估算值估算對象占用并拒絕新連接的內存量,但這似乎有點hacky /脆弱。
查看完整描述

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是空閑內存的良好指示。


查看完整回答
反對 回復 2019-11-12
  • 3 回答
  • 0 關注
  • 1324 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號