強引用、軟引用、弱引用、虛引用
強引用
強引用是無論在任何情況下,只要強引用關係還存在,即使垃圾收集器進行垃圾回收,甚至丟擲OOM,也不會回收掉被引用的物件,如下程式碼片段:
Object obj = new Object();
軟引用
軟引用是用來描述一些還有用,但非必須的物件。只被軟引用關聯著的物件,若JVM記憶體足夠時,即使觸發垃圾回收也不會回收該物件;但當JVM記憶體不夠時,系統在發生OOM之前,就會對這些物件進行回收,若回收之後,還是沒有足夠的空間時,才會丟擲OOM。下面我們用示例程式碼來說明:
/**
* 軟引用
* <p>
* -Xmx10M -Xms10M -XX:+PrintGCDetails
*/
public class SoftTest {
public static void main(String[] args) throws Exception {
SoftReference<Soft> soft = new SoftReference<>(new Soft());
System.out.println("手動觸發gc前:" + soft.get());
// 手動觸發一次gc
System.gc();
// 睡眠1秒鐘,等待手動觸發gc能夠成功
TimeUnit.SECONDS.sleep(1);
System.out.println("手動觸發gc後:" + soft.get());
// 再嘗試建立一個強引用物件,分配5M記憶體
// 因為我們堆空間最大10M記憶體,會出現Full GC
Soft soft1 = new Soft();
System.out.println("jvm記憶體不足後:" + soft.get());
}
}
class Soft {
// 申請一個5M記憶體的陣列
private byte[] filed = new byte[1024 * 1024 * 5];
}
執行上面的程式碼,並設定執行時引數:-Xmx10M -Xms10M -XX:+PrintGCDetails,執行結果如下圖所示:
從執行結果來看,在jvm記憶體足夠時,即使手動觸發一次GC,被軟引用的物件沒有被回收,但是一旦記憶體不足觸發GC後,只被軟引用著的物件會被回收。
弱引用
弱引用也是用來描述那些非必須的物件,它比軟引用的強度更弱一些,被弱引用關聯的物件只能生存到下一次垃圾收集器發生為止,即只要垃圾收集器開始工作,無論jvm記憶體是否充足,都會回收掉只被弱引用關聯的物件。下面我們用如下程式碼示例說明:
/**
* 弱引用
* <p>
* -XX:+PrintGCDetails
*/
public class WeakTest {
public static void main(String[] args) throws Exception {
WeakReference<Weak> weak = new WeakReference<>(new Weak());
System.out.println("手動觸發gc前:" + weak.get());
// 手動觸發一次gc
System.gc();
// 睡眠1秒鐘,等待手動觸發gc能夠成功
TimeUnit.SECONDS.sleep(1);
System.out.println("手動觸發gc後:" + weak.get());
}
}
class Weak {
}
執行上面的程式碼,並設定執行時引數:-XX:+PrintGCDetails,執行結果如下圖所示:
虛引用
虛引用是一種最弱的引用關係,一個物件是否存在虛引用,完全不會對其生存時間構成任何影響,也無法通過虛引用來取得一個物件的例項。為一個物件設定虛引用關聯的唯一目的只是為了能在這個物件被收集器回收時收到一個系統通知,我們可以檢視JDK定義的PhantomReference類,從類中可以看到,建立虛引用時,必須與一個引用佇列進行關聯,程式碼如下:
總結
最後做一個總結:
強引用:JVM即使記憶體不足時,丟擲OOM,也不會回收掉強引用關聯的物件;
軟引用:JVM即使記憶體不足時,才會回收掉軟引用關聯的物件;
弱引用:垃圾收集器工作時,無論記憶體是否足夠,都會回收掉弱引用關聯的物件;
虛引用:不會影響虛引用關聯物件的生存時間。
相關文章
- 強引用 軟引用 弱引用 虛引用
- 強引用,軟引用,弱引用,虛引用
- 強引用、軟引用、弱引用與虛引用
- Java的強引用、軟引用、弱引用、虛引用Java
- 【JVM】如何理解強引用、軟引用、弱引用、虛引用?JVM
- Java四種引用包括強引用,軟引用,弱引用,虛引用。Java
- 理解Java的強引用、軟引用、弱引用和虛引用Java
- Java/Android中的強引用、軟引用、弱引用、虛引用JavaAndroid
- Java四大引用詳解:強引用、軟引用、弱引用、虛引用Java
- java的強引用、軟引用、弱引用、幻象引用,引用佇列總結Java佇列
- 強引用、軟引用、弱引用、幻象引用有什麼區別?
- 關於強引用、軟引用、弱引用、幻象引用,你該如何回答?
- 強引用、軟引用、弱引用、幻象引用再不理解就晚了
- Java常見知識點彙總(⑲)——Java中的強引用、弱引用、軟引用、虛引用Java
- Java引用型別解析:掌握強引用、軟引用、弱引用和幻象引用的妙用Java型別
- 老徐和阿珍的故事:強引用、軟引用、弱引用、虛引用,傻傻分不清楚
- Java中強、軟、弱、虛四種引用詳解Java
- python3學習筆記之 強引用和弱引用Python筆記
- 垃圾回收(四)【弱引用】
- Java中的弱引用Java
- Swift 4 弱引用實現Swift
- 從原始碼解析 Swift 弱引用原始碼Swift
- 引用
- 引用以及引用的實質
- JVM 符號引用和直接引用JVM符號
- 方法引用
- HTML 引用HTML
- JVM - 引用JVM
- Markdown 引用
- C++ 右值引用和左值引用C++
- 03_方法引用與構造器引用
- C++左值引用與右值引用C++
- c++ 左值引用與右值引用C++
- 左值、左值引用、右值、右值引用
- C++11 左值引用和右值引用與引用摺疊和完美轉發C++
- 引用變數變數
- 右值引用
- C++ 引用C++