Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

Java 中强、软、弱、虚引用如何理解?

查看完整题解

参考回答

直接回答

强引用是通常使用对象的方式,会阻止对象在强可达时被回收;软引用允许按内存需求清理;弱引用不会维持对象的强存活;虚引用的 get() 始终返回 null,主要配合引用队列观察相应处理时机或安排清理。它们不是按固定时间依次执行的回收流程。

讲清原理

这些词描述对象如何通过引用路径被访问,以及收集器怎样处理相关引用。一个对象可能同时存在多条引用,不能只看到某个 WeakReference 就断定它现在是弱可达。

弱引用、软引用的 get() 都可能返回 null,使用时应处理缺失。虚引用不提供重新拿到对象的通道;采用 Cleaner 等机制时,清理动作还要避免反向强引用目标对象,否则可能妨碍预期的清理。

引用的可达性类别与处理条件,不是回收时间表
引用的可达性类别与处理条件,不是回收时间表

例子与易错点

Object strong = new Object();
var queue = new java.lang.ref.ReferenceQueue<Object>();
var phantom = new java.lang.ref.PhantomReference<>(strong, queue);
System.out.println(phantom.get()); // null

这个 null 并不证明对象已经被回收。入队、清理动作和实际内存回收也不能简单当成同一个瞬间。普通资源仍应及时关闭。

相关题:第 2 题、第 8 题、第 35 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。