java中得四種引用
Java中有四種引用類型:強引用、軟引用、弱引用、虛引用
- 強引用
我們代碼中常寫,如: Object() obj = new Object();
強引用對象永遠不會被JVM回收,即使最終OOM,可手動中斷,將其致為null,對象則被回收,可通過重寫finalize方法驗證,實際開發(fā)中,一定不要重寫finalize方法
- 軟引用
創(chuàng)建一個軟引用
SoftReference<Demo> demoSoftReference = new SoftReference<Demo>(new Demo());
軟引用通過SoftReference進行申明,通過泛型將對象包裹,當我們需要從軟引用對象獲取泛型對象時,通過get進行獲取。
Demo demo = demoSoftReference .get();
為什么會有軟引用呢?
我們先從它得特點談一談,程序在運行內存不足時,會觸發(fā)JVM得GC操作,如果GC過后,內存依舊不足,怎么辦呢?此時JVM就會把軟引用中得對象kill掉(內存不足,JVM才會回收此類對象,內存足夠得情況下,手動GC也不會進行該對象的回收操作),發(fā)揮你的想象,是不是想到了什么有趣得場景(項目內部緩存)呢!
- 弱引用
弱引用的使用和軟引用類似,關鍵字變成了WeakReference
WeakReference<Demo> weakReference = new WeakReference<Demo>(new Demo());
特點是不管內存是否足夠,只要發(fā)生GC,就會被回收,如果想了解相關用法可看一下ThreadLocal的源碼
- 虛引用
ReferenceQueue queue = new ReferenceQueue(); PhantomReference<Demo> reference = new PhantomReference<Demo>(new Demo(), queue);當發(fā)生GC操作,GC準備回收某個對象時,如果發(fā)現該對象有虛引用,就會在回收前,把這個虛引用加入到與之關聯的ReferenceQueue中,通過ReferenceQueue獲取進行其他操作
無法通過虛引用來獲取一個對象的真實引用(直接返回null),可見PhantomReference的get方法:public T get() { return null; }關于操作用法可關注下NIO,使用虛引用管理堆外內存