Java 對象的4種引用

更多 Java 虛擬機方面的文章慕购,請參見文集《Java 虛擬機》


引用隊列 Reference Queue

Reference queues, to which registered reference objects are appended by the garbage collector after the appropriate reachability changes are detected.
引用隊列骏令,首先在引用隊列中注冊對象引用束昵,當 GC 檢測到其中的對象可達性發(fā)生改變時辛友,將該對象引用添加到引用隊列中叉谜。

ReferenceQueueReference 自身的鏈表結(jié)構(gòu)所實現(xiàn)杰捂,提供了如下方法:

  • boolean enqueue(Reference<? extends T> r):入列比驻,由 Reference 對象調(diào)用
  • public Reference<? extends T> poll():出列
  • public Reference<? extends T> remove():刪除隊頭元素

強引用 Strong Reference

例如 String s = new String("abc");
強引用的對象不會被 GC 回收。

軟引用 Soft Reference

所在包:java.lang.ref
繼承自 Referencepublic class SoftReference<T> extends Reference<T>

軟引用的對象在內(nèi)存緊張時會被 GC 回收认轨。適合于創(chuàng)建緩存绅络。

使用步驟:

  • 創(chuàng)建對象
  • SoftReference 封裝該對象
public static void main(String[] args) {
    String s = new String("abc");
    SoftReference<String> ref = new SoftReference<String>(s);

    System.out.println(ref.get());
}

軟引用可以和一個引用隊列聯(lián)合使用,如果軟引用所引用的對象被垃圾回收器回收嘁字,GC 就會把這個軟引用加入到與之關(guān)聯(lián)的引用隊列中恩急。

弱引用 Weak Reference

所在包:java.lang.ref
繼承自 Referencepublic class WeakReference<T> extends Reference<T>

無論內(nèi)存是否緊張,GC 在碰到弱引用的對象時都會回收纪蜒。

使用步驟:

  • 創(chuàng)建對象
  • SoftReference 封裝該對象衷恭,注冊到 ReferenceQueue
public static void main(String[] args) throws Exception {
    ReferenceQueue<String> queue = new ReferenceQueue<String>();

    String s = new String("abc");
    WeakReference<String> ref = new WeakReference<String>(s, queue);

    System.out.println(queue.poll()); // null

    s = null; // 將引用設(shè)為 null
    System.gc(); // 執(zhí)行 GC, 當GC 檢測到其中的對象可達性發(fā)生改變時纯续,將該對象引用添加到引用隊列中
    Thread.sleep(1000);

    System.out.println(queue.poll()); // 從引用隊列中讀出
}

輸出:

null
java.lang.ref.WeakReference@1540e19d

弱引用的使用場景:集合類随珠。例如 WeakHashMap

An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. More precisely, the presence of a mapping for a given key will not prevent the key from being discarded by the garbage collector, that is, made finalizable, finalized, and then reclaimed. When a key has been discarded its entry is effectively removed from the map, so this class behaves somewhat differently from other Map implementations.
WeakHashMap 中的元素 Entry,當它的 key 不再使用時杆烁,Entry 會被自動刪除牙丽。
更準確地說,即使某個 key 仍然在 WeakHashMap 中兔魂,這個 key 還是會被 GC 回收,當 key 被回收后举娩,它對應的整個 Entry 就會從 WeakHashMap 中刪除析校。

示例:

// HashMap 中對 key 是強引用
HashMap<Integer, String> map = new HashMap<Integer, String>();
Integer it1 = new Integer(1);
map.put(it1, "A");

// WeakHashMap 中對 key 是弱引用
WeakHashMap<Integer, String> weakHap = new WeakHashMap<Integer, String>();
Integer it2 = new Integer(1);
weakHap.put(it2, "A");

// 將 key 對象設(shè)為不可達狀態(tài)
it1 = null;
it2 = null;

// 掃描所有對象构罗,檢查是否可達狀態(tài)
System.gc();
Thread.sleep(1000);

System.out.println(map.get(1)); // 輸出 A
System.out.println(weakHap.get(1)); // 輸出 null

虛引用 Phantom Reference

所在包:java.lang.ref
繼承自 Referencepublic class PhantomReference<T> extends Reference<T>

虛引用的對象在任何時候都可能被垃圾回收器回收。
虛引用不能單獨使用智玻,需要放在一個 ReferenceQueue 中遂唧,用于追蹤對象被 GC 回收的情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吊奢,一起剝皮案震驚了整個濱河市盖彭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌页滚,老刑警劉巖召边,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裹驰,居然都是意外死亡隧熙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門幻林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贞盯,“玉大人,你說我怎么就攤上這事沪饺□锔遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵整葡,是天一觀的道長父丰。 經(jīng)常有香客問我,道長掘宪,這世上最難降的妖魔是什么蛾扇? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮魏滚,結(jié)果婚禮上镀首,老公的妹妹穿的比我還像新娘。我一直安慰自己鼠次,他們只是感情好更哄,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腥寇,像睡著了一般成翩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赦役,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天麻敌,我揣著相機與錄音,去河邊找鬼掂摔。 笑死术羔,一個胖子當著我的面吹牛赢赊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播级历,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼释移,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寥殖?” 一聲冷哼從身側(cè)響起玩讳,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚼贡,沒想到半個月后熏纯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡编曼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年豆巨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掐场。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡往扔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熊户,到底是詐尸還是另有隱情萍膛,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布嚷堡,位于F島的核電站蝗罗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蝌戒。R本人自食惡果不足惜串塑,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望北苟。 院中可真熱鬧桩匪,春花似錦、人聲如沸友鼻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彩扔。三九已至妆档,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虫碉,已是汗流浹背贾惦。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纤虽。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓乳绕,卻偏偏與公主長得像绞惦,于是被迫代替她去往敵國和親逼纸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容