強參考、軟參考、弱參考、虛參考 · 語雀 (yuque.com)
自 JDK1.2 開始,Java 提供了 4 種參考關系,以表示參考和實體物件的關系,
強參考“一直存活著”
強參考,就是我們最常見的普通物件參考,
只要強參考還存在,垃圾收集器永遠不會回收掉被參考的實體物件,
Object o = new Object();
軟參考“有 n 次活的機會”
在系統將要發生記憶體溢位例外之前,垃圾收集器會把只被軟參考關聯著的實體物件進行回收,如果這次回識訓沒有足夠的記憶體,才會拋出記憶體溢位例外(OutOfMemoryError),
軟參考通常用來實作記憶體敏感的快取:
- 如果還有空閑記憶體,就可以暫時保留快取;
- 如果記憶體不足,則清理掉快取;
這樣就保證了使用快取的同時,不會耗盡記憶體,
SoftReference<Object> softO = new SoftReference<>(new Object());
弱參考“回收就會死亡”
被弱參考關聯著的實體物件只能生存到下一次垃圾收集發生之前,當垃圾收集器作業時,無論當前記憶體是否足夠,都會回收掉只被弱參考關聯的實體物件,
弱參考可以用來構建一種沒有特定約束的關系,比如,維護一種非強制性的映射關系,如果試圖獲取時物件還在,就使用它,否則重現實體化,弱參考同樣是很多快取實作的選擇,
WeakReference<Object> weakO = new WeakReference(new Object());
虛參考“隨時可能被回收”
虛參考也稱為“幽靈參考”或者“幻影參考”,虛參考是最弱的一種參考關系,
- 在Java 8以及之前的版本中,在虛參考回收后,虛參考指向的物件才會回收,
- 在Java 9以及更新的版本中,虛參考不會對物件的生存時間產生任何影響,
無法通過虛參考來獲取一個實體物件,
虛參考主要用來跟蹤物件被垃圾回收的活動,回收物件關聯的資源,
在Java 8以及之前的版本中,當垃圾收集器準備回收一個實體物件時,如果發現它還有虛參考,就會在回收實體物件之前,把這個虛參考加入到與之關聯的參考佇列中,程式如果發現某個虛參考已經被加入到參考佇列,那么就可以在所參考的物件的記憶體被回收之前采取必要的行動,然后斷開虛參考物件的參考,虛參考被回識訓者不可達,虛參考指向的物件才會回收,
Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue<>();
PhantomReference<Object> p = new PhantomReference<>(counter, refQueue);
counter = null;
System.gc();
try {
// Remove 是一個阻塞方法,可以指定 timeout,或者選擇一直阻塞
Reference<Object> ref = refQueue.remove(1000L);
if (ref != null) {
// do something
ref = null;
}
} catch (InterruptedException e) {
// Handle it
}
參考資料
第4講 | 強參考、軟參考、弱參考、幻象參考有什么區別?
ThreadLocal 原理分析及記憶體泄漏演示
本文來自博客園,作者:真正的飛魚,轉載請注明原文鏈接:https://www.cnblogs.com/feiyu2/p/reference.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500171.html
標籤:其他
上一篇:學生選課系統的專案開發
