不同的參考型別

java.lang.ref 包提供了引用物件類,它支援與垃圾收集器的有限程度的互動。

Java 有四種主要的不同引用型別。他們是:

  • 強烈參考
  • 弱參考
  • 軟參考
  • 幽靈參考

1.強烈的參考

這是建立物件的常用形式。

MyObject myObject = new MyObject();

變數 holder 持有對建立物件的強引用。只要此變數處於活動狀態並儲存此值,垃圾收集器就不會收集 MyObject 例項。

2.弱參考

如果你不想讓物件保持更長時間,並且需要儘快清除/釋放為物件分配的記憶體,則可以這樣做。

WeakReference myObjectRef = new WeakReference(MyObject);

簡單地說,弱引用是一個不足以強制物件保留在記憶體中的引用。弱引用允許你利用垃圾收集器為你確定可達性的能力,因此你不必自己執行此操作。

當你需要建立的物件時,只需使用 .get() 方法:

myObjectRef.get();

以下程式碼將舉例說明:

WeakReference myObjectRef = new WeakReference(MyObject);
System.out.println(myObjectRef.get()); // This will print the object reference address
System.gc();
System.out.println(myObjectRef.get()); // This will print 'null' if the GC cleaned up the object

3.軟參考

軟引用比弱引用略強。你可以建立一個軟引用物件,如下所示:

SoftReference myObjectRef = new SoftReference(MyObject);

它們可以比弱引用更強地保留在記憶體中。如果你有足夠的記憶體供應/資源,垃圾收集器將不會像弱引用那樣熱心地清理軟引用。

軟引用在快取中很方便。你可以將軟引用物件建立為快取,直到記憶體耗盡為止。當你的記憶體無法提供足夠的資源時,垃圾收集器將刪除軟引用。

SoftReference myObjectRef = new SoftReference(MyObject);
System.out.println(myObjectRef.get()); // This will print the reference address of the Object
System.gc();
System.out.println(myObjectRef.get()); // This may or may not print the reference address of the Object

4.幽靈參考

這是最弱的引用型別。如果使用 Phantom Reference 建立了物件引用,則 get() 方法將始終返回 null!

這種引用的使用是“幻影引用物件,它們在收集器確定它們的物件可以被回收之後排隊。幻像引用最常用於以比以下更靈活的方式安排預先清理操作。Java 終結機制。“ - 來自 Oracle 的 Phantom 參考 Javadoc

你可以建立 Phantom Reference 的物件,如下所示:

PhantomReference myObjectRef = new PhantomReference(MyObject);