變量的四種引用


強引用
   只要引用存在,垃圾回收器永遠不會回收,在 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; 
wf.get();//有時候會返回null wf.isEnQueued();//返回是否被垃圾回收器標記為即將回收的垃圾
  弱引用是在第二次垃圾回收時回收,短時間內通過弱引用取對應的數據,可以取到,當執行過第二次垃圾回收時,將返回null。弱引用主要用於監控對象是否已經被垃圾回收器標記為即將回收的垃圾,可以通過弱引用的isEnQueued 方法返回對象是否被垃圾回收器標記。
ThreadLocal 中有使用到弱引用:
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 = v; 
            } 
        } 
    //.... 
    }
//..... 
}                

 

虛引用
  
  虛引用需要 PhantomReference 類來實現,它不能單獨使用,必須和引用隊列聯合使用。 虛引用的主要作用是跟蹤對象被垃圾回收的狀態。垃圾回收時回收,無法通過引用取到對象值,可以通過如下代碼實現:
Object obj = new Object(); 
PhantomReference<Object> pf = new PhantomReference<Object>(obj); 
obj=null; 
pf.get();//永遠返回null 
pf.isEnQueued();//返回是否從內存中已經刪除

  虛引用是每次垃圾回收的時候都會被回收,通過虛引用的get方法永遠獲取到的數據為null,因此也被成為幽靈引用。虛引用主要用於檢測對象是否已經從內存中刪除。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM