一、四种引用分别是什么?(通俗比喻)
把对象比作手机:
- 强引用 → 手里紧紧攥着,扔不掉
- 软引用 → 放包里,内存够就留着,不够就扔
- 弱引用 → 放桌上,GC 一来就拿走
- 虚引用 → 贴个标签,根本拿不到手机,只用来跟踪回收
二、专业定义 + 回收时机(面试标准答案)
1. 强引用(Strong Reference)
默认引用,平时写的 99% 都是它
Object obj = new Object();
特点
- 最强
- 只要强引用还在,GC 永远不会回收
- 内存不够直接抛 OOM
回收时机
永远不回收,除非 obj = null
使用场景
所有业务对象、普通变量
2. 软引用(Soft Reference)
内存不够才回收,用于缓存
SoftReference<Object> sr = new SoftReference<>(obj);
特点
- 内存充足:不回收
- 内存不足:立即回收
- 回收后返回 null
回收时机
OOM 前最后一刻回收
使用场景
缓存(图片缓存、网页缓存)
3. 弱引用(Weak Reference)
GC 一来就回收
WeakReference<Object> wr = new WeakReference<>(obj);
特点
- 不管内存够不够
- 只要发生 GC,立即回收
回收时机
每次 GC 必收
使用场景
临时缓存、ThreadLocal、WeakHashMap
4. 虚引用(Phantom Reference)
最弱,等于没有引用,只为了监听回收
ReferenceQueue queue = new ReferenceQueue();
PhantomReference<Object> pr = new PhantomReference<>(obj, queue);
特点
- 永远拿不到对象
- 必须配合 引用队列 使用
- 唯一作用:监听对象什么时候被回收
回收时机
和没有引用一样,随时会被回收
使用场景
堆外内存释放、NIO、监控对象回收
三、一张表彻底分清(面试直接背)
| 引用类型 | 回收时机 | 强度 | 用途 |
|---|---|---|---|
| 强引用 | 永不回收(除非置 null) | 最强 | 业务对象 |
| 软引用 | 内存不足才回收 | 强 | 缓存 |
| 弱引用 | GC 一来就回收 | 弱 | ThreadLocal、临时缓存 |
| 虚引用 | 随时回收,拿不到对象 | 最弱 | 监听回收、堆外内存 |
四、最关键的 3 句总结
- 强引用 = 绝不回收
- 软引用 = 内存不够才回收
- 弱引用 = 一 GC 就回收
- 虚引用 = 拿不到对象,只监听回收