1. 程式人生 > >什麼是Java的弱引用(Weak Reference)

什麼是Java的弱引用(Weak Reference)

 之前一直沒有接觸過弱引用這個概念,今天看到以後覺得挺新鮮,就查了查資料總結一下,希望對大家有所幫助。
 要理解弱引用,首先要先了解一下強引用(Strong Reference),  其實我之前也並不瞭解強引用,雖然天天都在用。舉例來說:
         
  1. String abc = new String ("abcdf");
這就是建立了一個String的例項然後在變數abc中儲存一個強引用,為什麼說它強(Strong)呢?這是跟垃圾回收器相關的,如果一個物件是通過強引用鏈(Chain of Strong Reference) 訪問到的,也就是像上面那樣,那麼這個物件是不會被垃圾回收器回收的, 這在正常情況下是正確的,因為你不想垃圾回收器回收你正在使用的物件。當記憶體空間不足時,Java虛擬機器寧願丟擲OutOfMemory錯誤,是程式異常終止,也不會為了解決記憶體不足而回收這類引用的物件。這就是使用強引用的一個問題, 強引用的另外一個常見的問題就是快取, 特別是對於那些非常大的資料結構,像圖片等等,平差情況下我們是希望程式能快取這些大的資料結構的,因為重新載入非常耗費伺服器資源。因為快取就是為了避免重新載入這些大的資料結構的,所以快取中會儲存一個指向記憶體中資料結構的引用,而這些引用通常都是強引用,所以這些引用會強迫這些大的資料結構儲存在記憶體中,除非用通過某些方法戶知道哪一個資料結構不再需要儲存在記憶體中了,然後再把他從快取中清除。

弱引用就是不保證不被垃圾回收器回收的物件,它擁有比較短暫的生命週期,在垃圾回收器掃描它所管轄的記憶體區域過程中,一旦發現了只具有弱引用的物件,就會回收它的記憶體,不過一般情況下,垃圾回收器的執行緒優先順序很低,也就不會很快發現那些只有弱引用的物件。

弱引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果弱引用的物件被垃圾回收的話,Java虛擬機器就會把這個弱引用加入相關的引用佇列中。
一下就是建立弱引用物件的例子。
  1. String abc = 
    new String("abcde");
  2. WeakReference<String> wf= new WeakReference<String>(str, rq);

String abc1 = wf.get()//如果abcde這個物件沒有被垃圾回收器回收,那麼abc1就指向"abcde"物件