強引用
- M m = new M();
- 沒有任何引用指向該對象時, 該對象就能被回收,最常用的引用
軟引用
- SoftReference<byte[]> m = new SoftReference<>(new byte[1024]); SoftReference 軟引用 byte 數(shù)組
- 內存不足及回收,常用于緩存
弱引用
- WeakReference<M> m = new java.lang.ref.WeakReference<>(new M());
- 垃圾回收器看到即回收, 用于ThreadLocal等
虛引用
- java.lang.ref.PhantomReference<M> m = new java.lang.ref.PhantomReference<>(new M(),QUEUE);
- 關聯(lián)堆外內存,隨時能被回收,無法被get,被回收時自動存入隊列,用于 管理堆外內存(NIO等)
ThreadLocal 為什么使用弱引用
- 防止內存泄露
- ThreadLocal 以自身為 key,T為value 存儲在 ThreadLocalMap中 (弱引用)
- ThreadLocalMap 存儲在 Thread中, Thread 存在于線程池中,因此,強引用下 ThreadLocal 永遠可達,永遠不會被回收
- 在線程中,有對象使用 ThreadLocal 時(強引用) ,也不會被回收,因此,不會被誤回收
- ThreadLocal 雖然是弱引用,但是ThreadLocal僅作為KEY,因此,如果沒有顯示調用remove,v 的刪除會在set時,resize 方法中被清除