引用类型
强引用(Strong Reference)
- 默认的引用类型
- 只要强引用存在,对象就不会被垃圾回收
- 即使内存不足时抛出OOM,也不会回收强引用对象
软引用(Soft Reference)
- 内存充足时,不会被回收
- 内存不足时,会被回收(在OOM之前)
- 适合做缓存
弱引用(Weak Reference)
- 无论内存是否充足,只要发生GC就会被回收
- 比软引用生命周期更短
虚引用(Phantom Reference)
- 最弱的引用
- 无法通过虚引用获取对象(get()始终返回null)
- 必须与ReferenceQueue一起使用
- 对象被回收时,会收到通知
- 使用完必须调用clear()
注意:
- 虚引用的get()永远返回null - 这是设计上的特性
- 必须与ReferenceQueue配合使用 - 否则虚引用没有意义,因为get() 永远返回null。所有的引用都可以结合ReferenceQueue使用,只有虚引用必须配合ReferenceQueue使用,当从ReferenceQueue中拿到虚引用对象时,说明对象将被清理
- 虚引用必须调用clear() - 否则对象无法被完全回收。软引用和弱引用在GC时会自动调用clear(),所以程序员不需要显式调用,虚引用在GC时不会自动clear(),必须手动调用以完成对象回收(其实就是将引用置为null,解除和被引用对象的关系,使其可以被回收)
- 通知时机 - 对象进入finalization阶段,但还未从内存清除
软/弱引用:自动化内存管理
虚引用:精确控制资源释放时机
虚引用的特殊设计(get()返回null,必须手动clear())是为了:
- 防止误用(不应该通过虚引用获取对象)
- 确保资源在正确时机清理
- 提供对象回收的精确通知机制
对比

