Skip to content
基础

一句话答案

四种引用强度递减:强引用不回收、软引用内存不足时回收、弱引用 GC 就回收、虚引用仅跟踪回收时机。

核心要点
引用类型回收时机用途
强引用 Object o = new Object()永不回收(只要可达)普通变量
软引用 SoftReference内存不足时回收缓存(如图片缓存)
弱引用 WeakReference下次 GC 就回收ThreadLocalMap 的 key
虚引用 PhantomReference随时可回收跟踪对象被回收的时机(堆外内存管理)

ThreadLocal 与弱引用:

  • ThreadLocalMap 的 key 是 WeakReference<ThreadLocal>
  • ThreadLocal 对象被 GC 后,key 变 null,但 value 还在 → 内存泄漏
  • 解决:用完必须 remove()

软引用实际应用:

java
SoftReference<byte[]> cache = new SoftReference<>(new byte[1024*1024]);
byte[] data = cache.get(); // 内存够就返回,不够被回收返回null
追问与易错

追问方向:

  • ThreadLocal 的 key 为什么用弱引用?
  • 软引用什么时候用?
  • 虚引用的实际用途?

易错点:

  • ❌ 弱引用马上就被回收——是下次 GC 时回收
  • ❌ 混淆引用类型和 GC Roots

💡 记忆锚点

四级引用像四根保险绳:强引用焊死不断,软引用内存告急才剪(做缓存),弱引用下次GC必剪(ThreadLocal的key),虚引用绳已断只留回收通知(堆外内存清理)。ThreadLocal用完必remove,否则value强引用泄漏。