四种引用强度决定对象被 GC 回收的时机:强引用是默认形态,只要可达就绝不回收,OOM 也不收;**软引用(SoftReference)**在内存充足时保留、将要 OOM 前的 GC 中回收——适合做内存敏感缓存(图片缓存),JVM 保证抛出 OOM 前清掉所有软引用;**弱引用(WeakReference)**只要发生 GC(不管内存紧不紧)就被回收——WeakHashMap 的 key、ThreadLocal 的 key 用它,避免缓存键长期滞留;虚引用(PhantomReference)形同虚设,get() 永远返回 null,唯一作用是配合 ReferenceQueue 在对象被回收时收到通知,用于堆外内存的清理登记(DirectByteBuffer 的 Cleaner 机制)。

考点展开:1)软/弱引用进入 ReferenceQueue 的时机——引用本身被 GC 判定可回收后入队,应用轮询队列做善后;2)WeakHashMap 的 key 被回收后 entry 要显式 expunge,遍历 put/get 时才清理,长期不操作会泄漏 value;3)ThreadLocal 内存泄漏的完整链条(弱引用 key 被回收后 value 仍被线程持有,线程池长存导致泄漏)由此而来;4)虚引用 vs finalize——finalize 有复活对象、执行时机不确定、拖慢 GC 三大罪,Java 9 弃用,Cleaner(虚引用 + 队列)是替代品。追问方向:软引用的回收策略与 -XX:SoftRefLRUPolicyMSPerMB 的关系、引用与 GC Roots 可达性五个层次(强可达→软→弱→虚→不可达)。

(约 470 字)