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

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