Java中的幾種引用方式

來源:互聯網
上載者:User
Java中的幾種引用方式

Java中有幾種不同的引用方式,它們分別是:強引用、軟引用、弱引用和虛引用。下面,我們首先詳細地瞭解下這幾種引用方式的意義。


強引用

在此之前我們介紹的內容中所使用的引用都是強引用,這是使用最普遍的引用。如果一個對象具有強引用,那就類似於必不可少的生活用品,記憶體回收行程絕不會回收它。當記憶體空 間不足,Java虛擬機器寧願拋出OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的對象來解決記憶體不足問題。

軟引用(SoftReference)

SoftReference 類的一個典型用途就是用於記憶體敏感的快取。SoftReference 的原理是:在保持對對象的引用時保證在 JVM 報告記憶體不足情況之前將清除所有的軟引用。關鍵之處在於,垃圾收集器在運行時可能會(也可能不會)釋放軟可及對象。對象是否被釋放取決於垃圾收集器的演算法 以及垃圾收集器運行時可用的記憶體數量。

弱引用(WeakReference)

WeakReference 類的一個典型用途就是正常化映射(canonicalized mapping)。另外,對於那些生存期相對較長而且重新建立的開銷也不高的對象來說,弱引用也比較有用。關鍵之處在於,垃圾收集器運行時如果碰到了弱可及對象,將釋放 WeakReference 引用的對象。然而,請注意,垃圾收集器可能要運行多次才能找到並釋放弱可及對象。

虛引用(PhantomReference)

PhantomReference 類只能用於跟蹤對被引用對象即將進行的收集。同樣,它還能用於執行 pre-mortem 清除操作。PhantomReference 必須與 ReferenceQueue 類一起使用。需要 ReferenceQueue 是因為它能夠充當通知機制。當垃圾收集器確定了某個對象是虛可及對象時,PhantomReference 對象就被放在它的 ReferenceQueue 上。將 PhantomReference 對象放在 ReferenceQueue 上也就是一個通知,表明 PhantomReference 對象引用的對象已經結束,可供收集了。這使您能夠剛好在對象佔用的記憶體被回收之前採取行動。Reference與ReferenceQueue的配合使用。

GC、Reference與ReferenceQueue的互動

A、 GC無法刪除存在強引用的對象的記憶體。

B、 GC發現一個只有軟引用的對象記憶體,那麼:

① SoftReference對象的referent 域被設定為null,從而使該對象不再引用heap對象。

② SoftReference引用過的heap對象被聲明為finalizable。

③ 當 heap 對象的 finalize() 方法被運行而且該對象佔用的記憶體被釋放,SoftReference 對象就被添加到它的 ReferenceQueue(如果後者存在的話)。

C、 GC發現一個只有弱引用的對象記憶體,那麼:

① WeakReference對象的referent域被設定為null,從而使該對象不再引用heap對象。

② WeakReference引用過的heap對象被聲明為finalizable。

③ 當heap對象的finalize()方法被運行而且該對象佔用的記憶體被釋放時,WeakReference對象就被添加到它的ReferenceQueue(如果後者存在的話)。

D、 GC發現一個只有虛引用的對象記憶體,那麼:

① PhantomReference引用過的heap對象被聲明為finalizable。

② PhantomReference在堆對象被釋放之前就被添加到它的ReferenceQueue。

值得注意的地方有以下幾點:

1、GC在一般情況下不會發現軟引用的記憶體對象,只有在記憶體明顯不足的時候才會發現並釋放軟引用對象的記憶體。

2、GC對弱引用的發現和釋放也不是立即的,有時需要重複幾次GC,才會發現並釋放弱引用的記憶體對象。
3、軟引用和弱引用在添加到ReferenceQueue的時候,其指向真實記憶體的引用已經被置為空白了,相關的記憶體也已經被釋放掉了。而虛引用在添加到ReferenceQueue的時候,記憶體還沒有釋放,仍然可以對其進行訪問。

原文地址:http://www.blogjava.net/zh-weir/archive/2011/02/23/345007.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.