3

我读了这篇文章,现在我清楚了弱引用和软引用之间的基本区别是什么。我也明白,与弱引用不同(如果没有对该对象的强引用,这将导致在下一个 GC 周期中收集该对象),软引用保留在内存中,直到 JVM 内存不足。

但我的问题是,如果 JVM 内存不足并且垃圾收集器也开始收集软引用,它应该在逻辑上收集所有带有软引用的现有对象(我的猜测)。我是对的吗?

我想到的另一件事是软引用有一个非常好的用例,即内存缓存。但如果我拥有的所有软引用都将被 GC 一次性清除,那么这可能不是我们一直想要的预期结果。

有没有办法控制将被清除的软引用的百分比?或者我们可以告诉 GC 在恢复了特定数量的内存后停止清除软引用吗?

我问这个是为了更好地掌握如何有效地使用软引用,显然没有人会希望他们的缓存完全从内存中清除,即使您需要非常少量的内存。

4

1 回答 1

3

这里有更多的非正式答案:

首先,没有必要立即收集所有软引用。从理论上讲,JVM 可以(另外)跟踪上次使用情况或一些使用情况计数器。并以此为基础做出决定(首先只清除“较旧”或“较少使用”的软引用)。或者它按引用“链接”到的实际内存量对软引用进行排序。

除此之外,JVM 可能会在固定的内存增量上运行。含义:当您只需要/想要 50 MB 时,为什么要丢弃 500 MB 内存的软引用?!

换句话说:清除所有软引用是“最容易实施”的简单策略,但不是唯一的选择。JVM 可以自由地实施各种策略。例如,试图删除尽可能少的软引用,以便专门支持内存缓存!

因此,除非其他一些答案可以显示 JLS 部分明确指出它们应该一次性清除,否则您不应该根据您对什么是合乎逻辑的“感知”得出结论。

于 2018-08-12T17:37:46.803 回答