強參考:new 出的物件之類的參考,只要強參考還在,永遠不會回收,
強參考是使用最普遍的參考,如果一個物件具有強參考,那垃圾回收器絕不會回收它,如下:
Object strongReference = new Object();
軟參考:參考但非必須的物件,記憶體溢位例外之前,回收,
軟參考可以和一個參考佇列(ReferenceQueue)聯合使用,如果軟參考所參考物件被垃圾回收,JAVA虛擬機就會把這個軟參考加入到與之關聯的參考佇列中,
ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
String str = new String("abc");
SoftReference<String> softReference = new SoftReference<>(str, referenceQueue);
str = null;
// Notify GC
System.gc();
System.out.println(softReference.get()); // abc
Reference<? extends String> reference = referenceQueue.poll();
System.out.println(reference); //null
弱參考:非必須的物件,物件能生存到下一次垃圾收集發生之前,
String str = new String("abc");
WeakReference<String> weakReference = new WeakReference<>(str);
str = null;
WeakReference物件的生命周期基本由垃圾回收器決定,一旦垃圾回收執行緒發現了弱參考物件,在下一次GC程序中就會對其進行回收,
虛參考:對生存時間無影響,在垃圾回收時得到通知,
虛參考顧名思義,就是形同虛設,與其他幾種參考都不同,虛參考并不會決定物件的生命周期,如果一個物件僅持有虛參考,那么它就和沒有任何參考一樣,在任何時候都可能被垃圾回收器回收,
應用場景:
虛參考主要用來跟蹤物件被垃圾回收器回收的活動, 虛參考與軟參考和弱參考的一個區別在于:
虛參考必須和參考佇列(ReferenceQueue)聯合使用,當垃圾回收器準備回收一個物件時,如果發現它還有虛參考,就會在回收物件的記憶體之前,把這個虛參考加入到與之關聯的參考佇列中,
String str = new String("abc");
ReferenceQueue queue = new ReferenceQueue();
// 創建虛參考,要求必須與一個參考佇列關聯
PhantomReference pr = new PhantomReference(str, queue);
程式可以通過判斷參考佇列中是否已經加入了虛參考,來了解被參考的物件是否將要進行垃圾回收,如果程式發現某個虛參考已經被加入到參考佇列,那么就可以在所參考的物件的記憶體被回收之前采取必要的行動,
總結
Java中4種參考的級別和強度由高到低依次為:強參考 -> 軟參考 -> 弱參考 -> 虛參考
當垃圾回收器回收時,某些物件會被回收,某些不會被回收,垃圾回收器會從根物件Object來標記存活的物件,然后將某些不可達的物件和一些參考的物件進行回收,
本文由猿必過 YBG 發布
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263190.html
標籤:Java
上一篇:bean的生命周期
下一篇:五分鐘掃盲:行程與執行緒基礎必知
