我讀了這篇文章,現在我很清楚弱引用和軟引用之間的基本區別是什么。我也明白,與弱引用不同(如果沒有對該對象的強引用,這將導致在下一個 GC 周期中收集該對象),軟引用會保留在內存中,直到 JVM 內存不足。但是我的問題是如果 JVM 內存不足并且垃圾收集器也開始收集軟引用,它應該在邏輯上收集所有具有軟引用的現有對象(我的猜測)。我是對的嗎?我想到的另一件事是軟引用有一個很好的用例,那就是內存緩存。但是如果我擁有的所有軟引用都將被 GC 一次性清除,那么這可能不是我們一直想要的。有沒有辦法控制將被清除的軟引用的百分比?或者我們可以告訴 GC 在它恢復了一定數量的內存后停止清除軟引用嗎?我問這個是為了更好地掌握如何有效地使用軟引用,顯然沒有人會希望他們的緩存從內存中完全清除,即使您需要非常少量的內存。
1 回答

元芳怎么了
TA貢獻1798條經驗 獲得超7個贊
這里有更多非正式的答案:
首先,立即收集所有軟引用不是合乎邏輯的。從理論上講,JVM 可以(另外)跟蹤上次使用情況或某個使用情況計數器。并基于此做出決定(首先只清除“較舊”或“較少使用”的軟引用)?;蛘咚ㄟ^引用“鏈接”到的實際內存量來對軟引用進行排序。
除此之外,JVM 可能會在固定的內存增量上運行。意思是:當您只需要/想要 50 MB 時,為什么要丟棄 500 MB 內存的軟引用?!
換句話說:清除所有軟引用是“最容易實現”的簡單策略,但不是唯一的選擇。JVM 可以自由地實施各種策略。例如,試圖刪除盡可能少的軟引用,以便專門支持內存緩存!
因此,除非其他答案可以顯示 JLS 部分明確指出它們應該一次性全部清除,否則您不應該根據您對合乎邏輯的“感知”得出結論。
添加回答
舉報
0/150
提交
取消