簡介
從JDK1.2版本開始,把物件的參考分為四種級別,從而使程式能更加靈活的控制物件的生命周期,這四種級別由高到低依次為:強參考、軟參考、弱參考和虛參考,下面分別介紹下這四種參考,
強參考
強參考是最常用的參考型別,如下所示,new Object()會創建一個Object物件并存盤在堆上,變數object存盤對該物件的強參考,
Object object = new Object();
強參考不會被垃圾回收,所以要想回收該物件,則應該將指向該物件的變數顯示設為null,這樣該物件就由強參考轉變為無參考了,
示例:
public class ReferenceDemo {
public static void main(String[] args) throws IOException {
//強參考不會被垃圾回收
ReferenceDemo referenceDemo = new ReferenceDemo();
//強參考轉變為無參考,無參考可被垃圾回收
referenceDemo = null;
//觸發垃圾回收
System.gc();
//阻塞主執行緒,等待垃圾回收執行緒執行
System.in.read();
}
//物件被回收之前呼叫
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("-----finalize-----");
}
}
軟參考
軟參考是使用SoftReference創建的,在記憶體空間充足的情況下,軟參考不會被回收,而在記憶體空間不足虛擬機拋出OutOfMemoryError之前,軟參考將會被回收,
示例:
public class ReferenceDemo {
public static void main(String[] args) throws InterruptedException {
//創建ReferenceDemo物件的軟參考
SoftReference<ReferenceDemo> softReference = new SoftReference<>(new ReferenceDemo());
//觸發垃圾回收
System.gc();
//阻塞主執行緒,等待垃圾回收執行緒執行
Thread.sleep(5000);
//softReference.get()回傳軟參考物件,如果物件已經被垃圾回收,則回傳null
System.out.println(softReference.get());
//創建25M的位元組陣列
byte[] bytes = new byte[1024 * 1024 * 25];
//記憶體已經不足,阻塞主執行緒,等待垃圾回收執行緒執行
Thread.sleep(5000);
//重新輸出軟參考物件
System.out.println(softReference.get());
}
}
/*
* 輸出結果:
* com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
* null
*/
注意:示例運行前需要設定堆記憶體大小為30M(-Xmx30m -Xms30m),
用途:軟參考可以用于對記憶體空間敏感的快取,快取的物件一直保存,直到記憶體空間不足而被回收,
弱參考
弱參考是使用WeakReference創建的,在垃圾回收執行緒執行程序中,只要找到了弱參考,不管記憶體空間是否足夠,弱參考物件都將被回收,由于垃圾回收執行緒是一個優先級很低的執行緒,因此不一定會很快發現那些只具有弱參考的物件,
示例:
public class ReferenceDemo {
public static void main(String[] args) throws InterruptedException {
//創建ReferenceDemo的弱參考
WeakReference<ReferenceDemo> weakReference = new WeakReference<>(new ReferenceDemo());
//weakReference.get()回傳弱參考物件,如果物件已經被垃圾回收,則回傳null
System.out.println(weakReference.get());
//觸發垃圾回收
System.gc();
//阻塞主執行緒,等待垃圾回收執行緒執行
Thread.sleep(3000);
//重新輸出弱參考物件
System.out.println(weakReference.get());
}
}
/*
* 輸出結果:
* com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
* null
*/
用途:弱參考也可以用于快取,可以參考WeakHashMap類,
虛參考
虛參考是使用PhantomReference創建的,它是所以參考型別中最弱的,虛參考物件和沒有參考的物件相同,可以在任何時候被垃圾回收,并且虛參考必須要與參考佇列一起使用,
當垃圾回收執行緒回收一個虛參考物件時,它將在垃圾回收后銷毀該物件,并將PhantomReference添加到參考佇列中,
示例:
public class ReferenceDemo {
public static void main(String[] args) throws InterruptedException {
//創建參考佇列
ReferenceQueue<Object> referenceQueue = new ReferenceQueue();
//創建ReferenceDemo的虛參考
PhantomReference<ReferenceDemo> phantomReference = new PhantomReference<>(new ReferenceDemo(), referenceQueue);
//phantomReference.get()總是回傳null
System.out.println("phantomReference.get():" + phantomReference.get());
//輪詢此佇列,查看是否有可用的Reference物件,有則回傳該物件,否則回傳null
System.out.println("referenceQueue.poll():" + referenceQueue.poll());
//觸發垃圾回收
System.gc();
//阻塞主執行緒,等待垃圾回收執行緒執行
Thread.sleep(3000);
System.out.println("------垃圾回收之后------");
System.out.println("phantomReference.get():" + phantomReference.get());
System.out.println("referenceQueue.poll():" + referenceQueue.poll());
}
}
/*
* 輸出結果:
* phantomReference.get():null
* referenceQueue.poll():null
* ------垃圾回收之后------
* phantomReference.get():null
* referenceQueue.poll():java.lang.ref.PhantomReference@76fb509a
*/
用途:虛參考可以用于精確的檢測物件何時從記憶體中洗掉,通過檢查參考佇列來判斷物件是否已經被回收,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274347.html
標籤:其他
