gpt4 book ai didi

java - 为什么幻像引用没有排队?

转载 作者:行者123 更新时间:2023-11-30 02:14:47 26 4
gpt4 key购买 nike

我正在倾向于幻像引用,并且我很困惑当引用对象被垃圾收集时幻像引用如何排队。

这是我的代码

    Object s = new Object();

ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
PhantomReference<Object> ref = new PhantomReference<Object>(s, queue);

s = null;
System.gc();
TimeUnit.SECONDS.sleep(1);
System.out.println(queue.poll());

正如预期的那样,queue.poll 将返回幻像引用:ref。

但是如果我对代码做一点更改:删除局部变量“ref”,queue.poll 将返回 null。

所以我可以推断,当JVM尝试对一个对象进行垃圾收集时,它会检查所有引用以查看是否有任何可以到达该对象的引用。

这应该是一个非常缓慢的进展。?

我设计了一个程序:使用幻像引用来追踪资源泄漏。分配资源时,会新建一个幻像引用并绑定(bind)到该资源。然后我发现:所有幻像引用都必须被存储,否则幻像引用将不会入队。

我检查了netty代码,发现netty存储了所有的幻像引用:io.netty.util.ResourceLeakDetector#allLeaks。

最佳答案

垃圾收集器像对待任何其他对象一样对待引用对象。来自 the documentation :

If a registered reference becomes unreachable itself, then it will never be enqueued.

理论上,是的,使用引用对象会导致垃圾收集效率低下,所以我不会为每个应用程序对象创建一个引用对象。但实际上,引用对象集往往非常小:它们旨在跟踪数据库连接等资源,而不是任意对象。

关于java - 为什么幻像引用没有排队?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48944818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com