天天看點

【Java -- 基礎】常見四種引用及應用場景(強、弱、軟、虛)

前言

在Java中,對象的引用類型十分重要,因為這取決于 JVM 的 GC 活動 & 活動。

從 JDK 1.2 後開始,Java的引用類型分為4種:強引用、軟引用、弱引用、虛引用

1. 強引用(StrongReference)

  • 特點

    垃圾回收器不會回收

  1. 當記憶體空間不足,JVM甯願抛出OutOfMemoryError錯誤,使程式異常終止,也不會靠随意回收具有強引用的對象來解決記憶體不足的問題
  2. 使用最普遍
  • 使用場景

    該變量不希望被垃圾回收器回收

  • 使用示例(為1個變量建立強引用)
String s="abc"

// 變量s = 字元串對象"abc"的一個強引用
// 注:隻要給強引用對象賦空值null,該對象就可被垃圾回收器回收
// 即:隻要給強引用對象s賦空值null,該對象就可以被垃圾回收器回收。因為該對象此時不再含有其他強引用      

2. 軟引用(SoftReference)

  • 特點

    當記憶體不足時,垃圾回收器會回收

  • 應用場景

    記憶體敏感的資料緩存機制,如圖檔、網頁緩存等

  • 使用示例(為1個變量建立軟引用)
// 1. 聲明強引用
String str=new String("Test"); 

// 2. 對str進行軟引用
ReferenceQueue<String> rq=new ReferenceQueue<String>(); 
SoftReference<String> sr=new SoftReference<String>(str,rq); 

// 3. 撤掉強引用
str=null;

// 4. 取出軟引用的對象:s即為str所指引的對象"Test"
String s=sr.get(); 
 
// 注:
//   a. 軟引用可與1個引用隊列聯合使用
//   b. 若軟引用所引用的對象被垃圾回收器回收,JVM就會把這個軟引用加入到與之關聯的引用隊列中      

3. 弱引用(WeakReference)

  • 特點

    一旦發現弱引用對象,無論記憶體足否,都會進行回收

即 擁有更短暫的生命周期
  • 應用場景

    1.防止記憶體洩漏,保證記憶體被JVM回收

    2.保護對象引用

  • 使用示例(為1個變量建立弱引用)
// 1. 聲明強引用 
Counter counter = new Counter();  
// 2. 聲明弱引用 
WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter);   
// 3. 撤掉強引用
counter = null; 
 
// 注:
//   a. 使用 類似軟引用,即也可與1個引用隊列聯合使用
//   b. 與軟引用的差別:具備更短的生命周期      

4. 虛引用(PhantomReference)

  • 特點

    任何時候都可能被垃圾回收器回收

  • 應用場景

    跟蹤對象被GC回收的活動

  • 使用示例(為1個變量建立虛引用)
// 虛引用 必須 和引用隊列 (ReferenceQueue)聯合使用
// 即 當垃圾回收器準備回收一個對象時,若發現它還有虛引用,在回收對象的記憶體之前,把這個虛引用加入到與之關聯的引用隊列中

// 1. 聲明強引用
DigitalCounter digit = new DigitalCounter(); 

// 2. 聲明虛引用
PhantomReference phantom = new PhantomReference(digit);  

// 3. 撤掉強引用
digit = null;