強引用
強引用是我們開發(fā)過程中最常見的,例如:
// new方法返回的都是強引用
Object object = new Object();
只要引用存在,強引用對應(yīng)的對象永遠都不會被回收,即便堆內(nèi)存不足,拋出Java.lang.OutOfMemoryError。
軟引用
// 可通過以下代碼創(chuàng)建軟引用,softReference就是一個Object對象的軟引用
SoftReference<Object> softReference = new SoftReference<>(new Object());
// 可通過get方法獲取Object對象,當對象被標記為需要回收時,則返回null
Object object = softReference.get();
軟引用對應(yīng)的對象在內(nèi)存不足時,是可以被JVM回收的,即便軟引用存在。
弱引用
// 通過以下代碼創(chuàng)建弱引用
WeakReference<Object> weakReference = new WeakReference<>(new Object());
// 通過get方法獲取Object對象,有時為null
Object object = weakReference.get();
// 返回該對象是否被標記為即將回收的對象
weakReference.isEnqueued();
弱引用對應(yīng)的對象在第二次垃圾回收時回收,即弱引用對應(yīng)的對象最多存活2個垃圾回收周期。
虛引用
// 通過以下代碼創(chuàng)建虛引用
PhantomReference<Object> phantomReference = new PhantomReference<>(new Object(), null);
// 永遠返回null,因此虛引用也被稱為幽靈引用
phantomReference.get();
// 返回該對象是否已被回收
phantomReference.isEnqueued();
虛引用對應(yīng)的對象每次垃圾回收時都會被回收。主要用于檢測對象是否已被回收。
結(jié)束語
將對象的引用分為這4種級別,是為了程序可以更好的控制對象的生命周期。
這4種引用級別對應(yīng)對象的生命周期長短為:
強引用 > 軟引用 > 弱引用 > 虛引用