java - 手动入队的弱引用状态如何?

标签 java garbage-collection weak-references

当您手动将引用入队时,对象的状态是什么?

this.s = "foo";
WeakReference<String> wr = new WeakReference<String>(this.s);
wr.enqueue();

我找到的所有文档都在谈论垃圾收集器将对象排入队列,而不是在手动执行时会发生什么。

在任何情况下这都有意义吗?对象入队但仍具有可访问的引用(强引用、弱引用、虚引用)是什么意思?

编辑:额外奖励后续问题:当对象在遥远的 future 某个时间变得无法访问时,它是否会再次入队?

最佳答案

强引用将保留,因此该对象不符合收集条件。正如 JVestry 指出的那样,如果您使用队列创建弱引用,则 wr.enqueue() 会按预期返回 true。

它的一个潜在用途是让您的处理程序能够对受待处理垃圾收集或某些其他系统状态更改影响的对象进行操作,在这些情况下您希望采取与收集对象相同的操作,例如也许你保留了对保存系统资源的东西的软引用,以便系统可以处理内存不足的情况,同时如果你正常完成,你仍然能够自己管理关闭资源。

关于第二个问题,无论您是使用 enqueue() 还是 gc 作为集合的一部分,引用只会入队一次。

编辑 重要的是要记住引用队列与引用之间的关系,在本例中为 wr,而不是引用对象,在本例中为 s。您可以对同一个对象有多个弱引用并实现多个入队(某种程度上),每个弱引用一个。但是,队列中的是弱引用,而不是引用对象,尽管它应该仍然可以从弱引用访问。请参阅 java.lang.ref 上的 javadoc在“通知”部分了解更多详细信息。

关于java - 手动入队的弱引用状态如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5585694/

相关文章:

java - Tomcat 和 JDBC

java - InternalResourceViewResolver 未解析

java - Jagatoo 的文档

java - 属性 getProperty 返回 null

java - 符合垃圾收集条件的对象

c# - 用空值初始化 WeakReference 可以吗?

java - 在 libgdx 中处理资源和屏幕

c# - 对象引用静态成员垃圾处理

objective-c - ARC下归零弱引用的集合

swift - 如何在快速闭包中实现单向引用