手动排队的弱参考状态是什么?

Jam*_*ore 10 java garbage-collection weak-references

手动将引用排入队列时对象的状态是什么?

this.s = "foo";
WeakReference<String> wr = new WeakReference<String>(this.s);
wr.enqueue();
Run Code Online (Sandbox Code Playgroud)

我发现的所有文档都讨论了垃圾收集器排队对象,而不是手动执行时会发生什么.

这有什么意义吗?对象被入队的意义是什么,但仍然有可达的引用(强,弱,幻像)?

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

phi*_*lwb 2

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

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

关于第二个问题,引用仅入队一次,无论是使用 enqueue() 还是 gc 将其作为集合的一部分执行。

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