【Java面试笔记:基础】4.强引用、软引用、弱引用、幻象引用有什么区别?
1. 引用类型及其特点
强引用(Strong Reference):
- 定义:最常见的引用类型,通过new关键字直接创建。
- 回收条件:只要强引用存在,对象不会被GC回收。
- 示例:
Object obj = new Object(); // 强引用
- 特点:
- 强引用是导致内存泄漏的常见原因(如未及时置为
null
)。 - 手动断开引用:
obj = null;
。
- 强引用是导致内存泄漏的常见原因(如未及时置为
软引用(Soft Reference):
- 定义:相对强引用弱化了一些的引用。通过
SoftReference
类实现,用于描述可有可无的对象。 - 回收条件:只有在 JVM 认为内存不足时,才会试图回收软引用指向的对象。JVM 会确保在抛出
OutOfMemoryError
之前,清理软引用指向的对象。 - 应用场景:内存敏感的缓存(如图片缓存、计算结果缓存)。如果还有空闲内存,可以暂时保留缓存,当内存不足时清理掉,避免耗尽内存。
- 示例:
SoftReference<byte[]> softRef = new SoftReference<>(new byte[1024 * 1024]); byte[] data = softRef.get(); // 可能返回null(若已被回收)
- 特点:
- 适合保存非必须但有用的数据,避免频繁重建。
- 可通过
ReferenceQueue
追踪被回收的对象。
弱引用(Weak Reference):
- 定义:通过
WeakReference
类实现,比软引用更弱。不能使对象豁免垃圾收集,仅提供一种访问在弱引用状态下对象的途径。 - 回收条件:垃圾收集器在扫描时,无论内存是否充足,一旦发生GC,对象就会被回收。
- 适用场景:非强制性的映射关系和缓存实现。例如,维护一种没有特定约束的关系,如果试图获取时对象还在,就使用它,否则重现实例化(如
WeakHashMap
中的键)。 - 示例:
WeakReference<Object></