You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PhantomReference虚可达对象转储时机及回收是否需二次GC?

PhantomReference虚可达对象的垃圾回收相关问题解答

1. 虚可达对象何时会被转储到ReferenceQueue?

当对象变为虚可达(即没有任何强、软、弱引用指向,仅被PhantomReference引用)后,JVM会在完成一次垃圾回收周期后,将对应的PhantomReference实例排入构造该引用时指定的ReferenceQueue中。

2. 出队并执行清理操作后,引用对象何时会被垃圾回收?

调用poll()(或remove())方法将PhantomReference从队列中取出,完成自定义清理操作后,只要这个PhantomReference实例本身不再被任何强引用持有,原引用对象会在后续的任意一次垃圾回收周期中被直接回收——前提是此时对象依然处于虚可达状态(没有被重新强引用)。

3. 是否需要像重写finalize()的对象那样多一次GC周期?

不需要。
重写finalize()方法的对象在第一次GC时会被标记为可终结,进入终结队列执行finalize方法,这个过程中对象可能被临时“复活”(比如在finalize里给自己加强引用),因此需要第二次GC才能真正回收;而PhantomReference的设计从根源上避免了对象复活的可能——虚可达对象无法通过PhantomReference重新获取到引用本身,只要PhantomReference被释放,对象就能在常规的GC周期中被回收,不需要额外的一轮GC。

内容的提问来源于stack exchange,提问作者Chetan Sharma 417

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:42:35