强引用
普通对象,GCroot
能引用到就不回收。
软引用
用于内存敏感的高速缓存。
内存不足时会被回收。
实际应用中使用ReferenceQueue
,回收后引用进入ReferenceQueue
。
弱引用
也用于缓存,但更容易被回收。
内存充足时也会被回收。
实际应用中使用ReferenceQueue
,回收后引用进入ReferenceQueue
。
案例: ThreadLocal的key
ThreadLocal
的key
是弱引用,被回收后,key
是null
,此时value
无法被访问,但是有强引用。
但是每次发生get,set,remove
的时候,会移除key
为null
的entry
,消除内存泄露。
虚引用
完全不影响回收,相当于没引用。
必须和引用队列 (ReferenceQueue
)联合使用,回收后引用进入ReferenceQueue
。