我读了这篇文章,现在我很清楚弱引用和软引用之间的基本区别是什么。我也明白,与弱引用不同(如果没有对该对象的强引用,这将导致在下一个 GC 周期中收集该对象),软引用会保留在内存中,直到 JVM 内存不足。但是我的问题是如果 JVM 内存不足并且垃圾收集器也开始收集软引用,它应该在逻辑上收集所有具有软引用的现有对象(我的猜测)。我是对的吗?我想到的另一件事是软引用有一个很好的用例,那就是内存缓存。但是如果我拥有的所有软引用都将被 GC 一次性清除,那么这可能不是我们一直想要的。有没有办法控制将被清除的软引用的百分比?或者我们可以告诉 GC 在它恢复了一定数量的内存后停止清除软引用吗?我问这个是为了更好地掌握如何有效地使用软引用,显然没有人会希望他们的缓存从内存中完全清除,即使您需要非常少量的内存。
1 回答
元芳怎么了
TA贡献1798条经验 获得超7个赞
这里有更多非正式的答案:
首先,立即收集所有软引用不是合乎逻辑的。从理论上讲,JVM 可以(另外)跟踪上次使用情况或某个使用情况计数器。并基于此做出决定(首先只清除“较旧”或“较少使用”的软引用)。或者它通过引用“链接”到的实际内存量来对软引用进行排序。
除此之外,JVM 可能会在固定的内存增量上运行。意思是:当您只需要/想要 50 MB 时,为什么要丢弃 500 MB 内存的软引用?!
换句话说:清除所有软引用是“最容易实现”的简单策略,但不是唯一的选择。JVM 可以自由地实施各种策略。例如,试图删除尽可能少的软引用,以便专门支持内存缓存!
因此,除非其他答案可以显示 JLS 部分明确指出它们应该一次性全部清除,否则您不应该根据您对合乎逻辑的“感知”得出结论。
添加回答
举报
0/150
提交
取消