Java語言的優點之一是它自動管理內存,程式設計師無需承擔內存管理的負擔,也無需擔心當不再需要對象時釋放對象的內存。 java垃圾收集器線程為程式設計師做這件事;它在JVM的控制下清除不需要的物件並釋放記憶體。程式設計師還可以透過使用 java.lang.ref 類別來控制何時對物件進行垃圾收集。 java 中的引用有四種類型,取決於垃圾收集的方式或垃圾收集器對引用的行為。
開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
根據垃圾收集器對引用的行為,Java 引用有四種類型。
強引用通常是我們在寫java程式碼或建立物件時使用的。具有強引用且在記憶體中處於活動狀態的物件不符合垃圾回收條件,強引用指向 null 的物件可以被垃圾回收。例如,下面的程式碼片段,其中變數 ob 是 ClassA 類型的物件。
ClassA ob = new ClassA();
「ob」物件具有指向類別 ClassA 的強引用;該物件無法被垃圾回收,因為 ob 是活動物件。
如果引用「ob」指向 null,如下 –
ob = null;
現在該物件不再引用 ClassA 類別;物件現在符合垃圾回收條件。
代碼:
package p1; class ClassA { // something } public class Demo { public static void main( String[] arg ) { ClassA ob = new ClassA(); // default reference or Strong Reference System.out.println(ob); ob = null; // Now object <u>ob</u> pointing to null and is available for garbage collection System.out.println(ob); } }
輸出:
弱引用符合垃圾回收條件。一旦 JVM 偵測到弱引用的對象,就會對該物件進行標記,並在 JVM 執行垃圾收集器執行緒時收集垃圾。這些類型的引用在 WeakHashMap 中用於物件的條目。弱引用可以透過類別 lang.ref.WeakReference 來建立。應用程式中可以使用的弱引用是建立 DBConnection,一旦資料庫關閉,垃圾收集器就會釋放該連線。例如,下面的程式碼片段,其中變數 ob 是 ClassA 類型的物件。
ClassA ob = new ClassA();
「ob」物件是一個強引用,使其可被垃圾回收,我們需要將其尊重轉換為弱引用,如下所示 –
WeakReference<ClassA> weakob = new WeakReference<ClassA>(ob);
現在該物件弱引用了 ClassA 類,該物件現在可用於垃圾回收,並且當 JVM 運行垃圾回收執行緒時該物件將被垃圾回收。
代碼:
package p1; import java.lang.ref.WeakReference; class ClassA { // something } public class Demo { public static void main( String[] arg ) { ClassA ob = new ClassA(); // default reference or Strong Reference System.out.println(ob); // now create Weak Reference object to which <u>ob</u> object is pointing WeakReference <ClassA> weakob = new WeakReference <ClassA>(ob); // Now <u>ob</u> object is eligible for garbage collection, but it will be remove from memory when JVM needs memory ob = null; System.out.println(ob); // weakly referenced <u>ob</u> object can get back ob = weakob.get(); System.out.println(ob); } }
輸出:
軟體引用的物件只有在 JVM 記憶體不足或 JVM 急需記憶體時才符合垃圾回收的條件。弱引用可以透過類別 lang.ref.SoftReference 建立。例如,軟引用可以創建類似於弱引用的內容。
SoftReference <ClassA> softob = new SoftReference <ClassA>(ob);
代碼:
package p1; import java.lang.ref.SoftReference; class ClassA { // something } public class Demo { public static void main( String[] arg ) { ClassA ob = new ClassA();// default reference or Strong Reference System.out.println(ob); // now create soft Reference object which ob object is pointing SoftReference <ClassA> softob = new SoftReference <ClassA>(ob); // Now ob object is eligible for garbage collection, but it will be garbage collected when JVM badly needs memory ob = null; System.out.println(ob); // the soft referenced, ob object can get back ob = softob.get(); System.out.println(ob); } }
輸出:
幻像所引用的物件可以被垃圾回收,但在垃圾回收之前,該物件被 JVM 放入名為「引用佇列」的參考佇列中;在物件上呼叫 Finalize() 函數之後。弱引用可以透過類別 lang.ref 建立。幻影參考。
代碼:
package p1; import java.lang.ref.ReferenceQueue; import java.lang.ref.PhantomReference; class ClassA { // something } public class Demo { public static void main( String[] arg ) { ClassA ob = new ClassA(); // default reference or Strong Reference System.out.println(ob); // now Create Reference queue object ReferenceQueue <ClassA> refq = new ReferenceQueue <ClassA>(); // Create Phantom Reference object to which <u>ob</u> object is pointing PhantomReference <ClassA> phantomob = new PhantomReference <ClassA>(ob,refq); // Now <u>ob</u> object is eligible for garbage collection, but it will be kept in '<u>refq</u>' before removing ob = null; System.out.println(ob); // to get back object which has been Phantom referenced returns null ob = phantomob.get(); System.out.println(ob); } }
輸出:
以上是Java 參考資料的詳細內容。更多資訊請關注PHP中文網其他相關文章!