不同的參考型別
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);