前言
在Java中,對象的引用類型十分重要,因為這取決于 JVM 的 GC 活動 & 活動。
從 JDK 1.2 後開始,Java的引用類型分為4種:強引用、軟引用、弱引用、虛引用
1. 強引用(StrongReference)
-
特點
垃圾回收器不會回收
- 當記憶體空間不足,JVM甯願抛出OutOfMemoryError錯誤,使程式異常終止,也不會靠随意回收具有強引用的對象來解決記憶體不足的問題
- 使用最普遍
-
使用場景
該變量不希望被垃圾回收器回收
- 使用示例(為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;