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 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。