java - 当您丢弃对 SoftReference 的引用时,它的清除仍会放在 ReferenceQueue 上吗?

标签 java garbage-collection java-memory-model soft-references

我想了解垃圾收集器在什么情况下会通知您清除软引用。文档清楚地表明它在可能发生 OOM 时发生,但是如果您完全丢弃引用,GC 会出现并收集 SoftReference 可能会注意到不存在其他强/软引用并清除内部引用值。

ReferenceQueue<Object> cleared = new ReferenceQueue<>();
Object X = new Object();
SoftReference<Object> Xs = new SoftReference<>(X, cleared);

Thread.sleep(10);
X = null;
Xs = null;

System.GC();
Thread.sleep(100);
Reference ref;
while ((ref = cleared.poll()) != null) {
   System.err.println(ref);
}

那么关于这个队列的规则记录在哪里?必须有比我问的更多的极端情况,所以也许这个问题必须扩大一点。

最佳答案

相关点可以在the package documentation中找到。在通知部分:

The relationship between a registered reference object and its queue is one-sided. That is, a queue does not keep track of the references that are registered with it. If a registered reference becomes unreachable itself, then it will never be enqueued. It is the responsibility of the program using reference objects to ensure that the objects remain reachable for as long as the program is interested in their referents.



所以答案很简单。由于您设置了唯一变量引用您的 SoftReferencenull ,它永远不会被排队。会不会被收集或清除,无所谓,因为你无法感知它。在实践中,典型的实现会像 Eugene 写的那样,垃圾收集器只遍历实时引用,而不关心剩余内存中存在什么样的垃圾。

关于java - 当您丢弃对 SoftReference 的引用时,它的清除仍会放在 ReferenceQueue 上吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62139955/

相关文章:

Windows 关机时 Java 退出

java - 为什么 ForkJoinPool::invoke() 会阻塞主线程?

java - JAXB 编码由 XmlAdapter 创建的 ArrayList

c# - .NET:我是否需要在异步下载时保留对 WebClient 的引用?

java - 关于重新排序 : Why this code throws RuntimeException despite using the volatile?

java - jdbc mysql连接

java - 在 Java 中处理内存不足情况的最佳方法是什么?

java - 如何释放已关闭以进行垃圾收集的执行程序服务的内存?

Java 内存模型 : a JLS statement about sequential consistency seems incorrect

java - ConcurrentHashMap 中的可变语义