请考虑以下代码:

public static final ReferenceQueue<Object> REF_QUEUE = new ReferenceQueue<>();

public class Foo extends PhantomReference<Object> {
    public Foo(Object obj) { super(obj, REF_QUEUE); }
}

public class Bar {
    private Foo foo;
    public void refTest() {
        foo = new Foo(new Apple("Cortland"));
        foo = null;
    }
}

PhantomReference的文档中写道:

如果垃圾回收器在某个时间点确定幻影引用的引用对象是幻影可达的,则在该时间或稍后的某个时间,垃圾回收器将使该引用入队.

然而,在refTest方法中,Cortland Apple变得不可访问--而不是幻影可访问--因为包含它的foo是不可访问的.Foo对象是否会在ref_Queue上排队?

推荐答案

这一点在the documentation中有明确的说明

注册的引用对象与其队列之间的关系是单边的.也就是说,队列不跟踪向其注册的引用.如果注册的引用本身变得不可访问,则它将永远不会入队.使用引用对象的程序有责任确保只要程序对其引用对象感兴趣,这些对象就保持可访问状态.

因此,如果您不保留对PhantomReference的引用,它的内存将像任何其他普通对象一样被回收,并且它永远不会排队.

由于垃圾收集器的工作方式是遍历所有可到达的对象,因此当它遇到幻影引用并在遍历结束时发现其引用对象未通过其他引用被遇到时,它将简单地将其入队.如果它没有遇到幻影引用,则不会发生任何事情.

Java相关问答推荐

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

try Dockerize Maven应用程序,但发布版本21不支持"

通过合并Akka Streams中的多个慢源保持订购

放气总是压缩整个街区吗?

GSON期间的Java类型擦除

我如何解释这个错误?必需类型:供应商R,提供:收集器对象,捕获?,java.util.List java.lang.Object>>

如何在JavaFX中处理多个按钮

使用正则表达式从字符串中提取多个值

Java Telnet客户端重复的IAC符号

二进制数据的未知编码/序列化

根本不显示JavaFX阿拉伯字母

如何在透视表中添加对计数列的筛选?

如何使用Criteria Builder处理一对多关系中的空值?

从映射列表中检索所有键

为什么相同的数据条码在视觉上看起来不同?

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

如果c不为null,Arrays.sort(T[]a,Comparator<;?super T>;c)是否会引发ClassCastException?

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

JOOQ:批处理CRUD操作使用动态表定义,如何?

如何使用java区分以下结果