強參考
只要參考存在,垃圾回收器永遠不會回收,在 Java 中最常見的就是強參考,把一個物件賦給一個參考變數,這個參考變數就是一個強參考,當一個物件被強參考變數參考時,它處于可達狀態,它是不可能被垃圾回識訓制回收的,即使該物件以后永遠都不會被用到 JVM 也不會回收,因此強參考是造成 Java 記憶體泄漏的主要原因之一,
Object obj = new Object(); User user=new User();可直接通過obj取得對應的物件 如 obj.equels(new Object()); 而這樣 obj 物件對后面 new Object 的一個強參考,只有當 obj 這個參考被釋放之后,物件才會被釋放掉,這也是我們經常所用到的編碼形式, 軟參考 非必須參考,記憶體溢位之前進行回收,可以通過以下代碼實作,軟參考需要用 SoftReference 類來實作,對于只有軟參考的物件來說,當系統記憶體足夠時它不會被回收,當系統記憶體空間不足時它會被回收,軟參考通常用在對記憶體敏感的程式中,
Object obj = new Object(); SoftReference<Object> sf = new SoftReference<Object>(obj); obj = null; sf.get();//有時候會回傳null這時候sf是對obj的一個軟參考,通過sf.get()方法可以取到這個物件,當然,當這個物件被標記為需要回收的物件時,則回傳null; 軟參考主要用戶實作類似快取的功能,在記憶體足夠的情況下直接通過軟參考取值,無需從繁忙的真實來源查詢資料,提升速度;當記憶體不足時,自動洗掉這部分快取資料,從真正的來源查詢這些資料, 弱參考 弱參考需要用 WeakReference 類來實作,它比軟參考的生存期更短,對于只有弱參考的物件來說,只要垃圾回識訓制一運行,不管 JVM 的記憶體空間是否足夠,總會回收該物件占用的記憶體,可以通過如下代碼實作:
Object obj = new Object(); WeakReference<Object> wf = new WeakReference<Object>(obj); obj = null;弱參考是在第二次垃圾回收時回收,短時間內通過弱參考取對應的資料,可以取到,當執行過第二次垃圾回收時,將回傳null,弱參考主要用于監控物件是否已經被垃圾回收器標記為即將回收的垃圾,可以通過弱參考的isEnQueued 方法回傳物件是否被垃圾回收器標記, ThreadLocal 中有使用到弱參考:
wf.get();//有時候會回傳null wf.isEnQueued();//回傳是否被垃圾回收器標記為即將回收的垃圾
public class ThreadLocal<T> {
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k); value = https://www.cnblogs.com/firecode7/p/v;
}
}
//....
}
//.....
}
虛參考 虛參考需要 PhantomReference 類來實作,它不能單獨使用,必須和參考佇列聯合使用,虛參考的主要作用是跟蹤物件被垃圾回收的狀態,垃圾回收時回收,無法通過參考取到物件值,可以通過如下代碼實作:
Object obj = new Object(); PhantomReference<Object> pf = new PhantomReference<Object>(obj); obj=null; pf.get();//永遠回傳null pf.isEnQueued();//回傳是否從記憶體中已經洗掉
虛參考是每次垃圾回收的時候都會被回收,通過虛參考的get方法永遠獲取到的資料為null,因此也被成為幽靈參考,虛參考主要用于檢測物件是否已經從記憶體中洗掉,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/148106.html
標籤:Java
下一篇:【HDFS篇09】集群安全模式
