外观
一句话答案
四种引用强度递减:强引用不回收、软引用内存不足时回收、弱引用 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强引用泄漏。