Java對象的四種引用類型

從Java SE2開始伊脓,就提供了四種類型的引用:強引用分蓖、軟引用唱凯、弱引用和虛引用。

Java中提供這四種引用類型主要有兩個目的:

  1. 讓程序員通過代碼的方式?jīng)Q定某些對象的生命周期睛低;

  2. 第二是有利于JVM進行垃圾回收案狠。

一、持有不同類型引用的對象回收規(guī)則

  • 強引用:無論內(nèi)存是否足夠钱雷,不會回收骂铁。

  • 軟引用:內(nèi)存不足時,回收該引用關(guān)聯(lián)的對象罩抗。

  • 弱引用:垃圾回收時拉庵,無論內(nèi)存是否足夠,都會回收套蒂。

  • 虛引用:任何時候都可能被垃圾回收器回收钞支。

1. 強引用

強引用是我們使用的最廣泛,也是最普遍的一種引用類型泣懊。

Object object = new Object();

只要某個對象有強引用與之關(guān)聯(lián)伸辟,JVM必定不會回收這個對象,即使在內(nèi)存不足的情況下馍刮,JVM寧愿拋出OutOfMemory錯誤也不會回收這種對象信夫。如果想中斷強引用和某個對象之間的關(guān)聯(lián),可以顯示地將引用賦值為null卡啰,這樣一來的話静稻,JVM在合適的時間就會回收該對象。

2. 軟引用

軟引用是用來描述一些有用但并不是必需的對象匈辱,在Java中用java.lang.ref.SoftReference類來表示振湾。對于軟引用關(guān)聯(lián)著的對象,只有在內(nèi)存不足的時候JVM才會回收該對象亡脸。因此押搪,這一點可以很好地用來解決OOM的問題树酪,并且這個特性很適合用來實現(xiàn)緩存:比如網(wǎng)頁緩存、圖片緩存等大州。

SoftReference<String> sr = new SoftReference<String>(new String("賭書消得潑茶香"));
System.out.println(sr.get());

軟引用可以和一個引用隊列(ReferenceQueue)聯(lián)合使用续语,如果軟引用所引用的對象被JVM回收,這個軟引用就會被加入到與之關(guān)聯(lián)的引用隊列中厦画。當(dāng)一個obj被gc掉之后疮茄,其相應(yīng)的包裝類,即ref對象會被放入queue中根暑。我們可以從queue中獲取到相應(yīng)的對象信息力试,同時進行額外的處理。比如反向操作排嫌,數(shù)據(jù)清理等畸裳。

3. 弱引用

弱引用也是用來描述非必需對象的,當(dāng)JVM進行垃圾回收時淳地,無論內(nèi)存是否充足躯畴,都會回收被弱引用關(guān)聯(lián)的對象。在java中薇芝,用java.lang.ref.WeakReference類來表示。

WeakReference<String> sr = new WeakReference<String>(new String("賭書消得潑茶香"));     
System.out.println(sr.get());
System.gc();                //通知JVM的gc進行垃圾回收
System.out.println(sr.get());  //輸出一定為null

不過要注意的是丰嘉,這里所說的被弱引用關(guān)聯(lián)的對象是指只有弱引用與之關(guān)聯(lián)夯到,如果存在強引用同時與之關(guān)聯(lián),則進行垃圾回收時也不會回收該對象(軟引用也是如此)饮亏。弱引用也可以和一個引用隊列(ReferenceQueue)聯(lián)合使用耍贾。

4. 虛引用

虛引用和前面的軟引用、弱引用不同路幸,它并不影響對象的生命周期荐开。在java中用java.lang.ref.PhantomReference類表示。如果一個對象與虛引用關(guān)聯(lián)简肴,則跟沒有引用與之關(guān)聯(lián)一樣晃听,在任何時候都可能被垃圾回收器回收

要注意的是砰识,虛引用必須和引用隊列關(guān)聯(lián)使用能扒,當(dāng)垃圾回收器準備回收一個對象時,如果發(fā)現(xiàn)它還有虛引用辫狼,就會把這個虛引用加入到與之關(guān)聯(lián)的引用隊列中初斑。程序可以通過判斷引用隊列中是否已經(jīng)加入了虛引用,來了解被引用的對象是否將要被垃圾回收膨处。如果程序發(fā)現(xiàn)某個虛引用已經(jīng)被加入到引用隊列见秤,那么就可以在所引用的對象的內(nèi)存被回收之前采取必要的行動砂竖。

ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("賭書消得潑茶香"), queue);
System.out.println(pr.get());

引用隊列可以和弱引用、軟引用聯(lián)合使用鹃答,虛引用必須與ReferenceQueue一起使用

5乎澄、引用隊列ReferenceQueue

ReferenceQueue主要是用于監(jiān)聽Reference所指向的對象是否已經(jīng)被垃圾回收。

當(dāng)大量使用Reference時挣跋,雖然Reference指向的對象可能被回收了三圆,但Reference本身也是個對象,所以也需要回收避咆。這時就需要使用ReferenceQueue了舟肉。

當(dāng)SoftReference或WeakReference的get()加入ReferenceQueue或get()返回null時,僅是表明其指示的對象已經(jīng)進入垃圾回收流程查库,此時對象不一定已經(jīng)被垃圾回收路媚。

當(dāng)PhantomReference加入ReferenceQueue時,則表明對象已經(jīng)被回收樊销。


參考鏈接

http://www.cnblogs.com/alias-blog/p/5793108.html
https://blog.csdn.net/houlin_jing/article/details/77986698

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末整慎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子围苫,更是在濱河造成了極大的恐慌裤园,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剂府,死亡現(xiàn)場離奇詭異拧揽,居然都是意外死亡,警方通過查閱死者的電腦和手機腺占,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門淤袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衰伯,你說我怎么就攤上這事铡羡。” “怎么了意鲸?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵烦周,是天一觀的道長。 經(jīng)常有香客問我怎顾,道長论矾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任杆勇,我火速辦了婚禮贪壳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚜退。我一直安慰自己闰靴,他們只是感情好彪笼,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚂且,像睡著了一般配猫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杏死,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天泵肄,我揣著相機與錄音,去河邊找鬼淑翼。 笑死腐巢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玄括。 我是一名探鬼主播冯丙,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遭京!你這毒婦竟也來了胃惜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哪雕,失蹤者是張志新(化名)和其女友劉穎船殉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斯嚎,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡捺弦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了孝扛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幽崩,死狀恐怖苦始,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慌申,我是刑警寧澤陌选,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蹄溉,受9級特大地震影響咨油,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柒爵,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一役电、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棉胀,春花似錦法瑟、人聲如沸冀膝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窝剖。三九已至,卻和暖如春酥夭,著一層夾襖步出監(jiān)牢的瞬間赐纱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工熬北, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疙描,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓蒜埋,卻偏偏與公主長得像淫痰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子整份,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355