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