[Java] Java的四種引用類型

從JDK1.2版本開(kāi)始铐然,把對(duì)象的引用分為四種級(jí)別童芹,從而使程序能更加靈活的控制對(duì)象的生命周期。這四種級(jí)別由

高到低依次為:強(qiáng)引用绣版、軟引用毕莱、弱引用和虛引用扮念。

1. 強(qiáng)引用(Strong Reference)

強(qiáng)引用是指創(chuàng)建一個(gè)對(duì)象并把這個(gè)對(duì)象賦給一個(gè)引用變量。

比如:

Object object =newObject();

String str ="hello";

強(qiáng)引用有引用變量指向時(shí)永遠(yuǎn)不會(huì)被垃圾回收,JVM寧愿拋出OutOfMemory錯(cuò)誤也不會(huì)回收這種對(duì)象奉芦。

2. 軟引用(Soft Reference)

如果一個(gè)對(duì)象具有軟引用疚漆,內(nèi)存空間足夠桂敛,垃圾回收器就不會(huì)回收它缀遍;

如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存杭朱。只要垃圾回收器沒(méi)有回收它阅仔,該對(duì)象就可以被程序使用。

SoftReference<T>? soft = new SoftReference<T>(obj);

作為一個(gè)Java對(duì)象弧械,SoftReference對(duì)象除了具有保存軟引用的特殊性之外八酒,也具有Java對(duì)象的一般性。所以刃唐,當(dāng)軟可及對(duì)象被回收之后羞迷,雖然這個(gè)SoftReference對(duì)象的get()方法返回null,但這個(gè)SoftReference對(duì)象已經(jīng)不再具有存在的價(jià)值,需要一個(gè)適當(dāng)?shù)那宄龣C(jī)制唁桩,避免大量SoftReference對(duì)象帶來(lái)的內(nèi)存泄漏闭树。在java.lang.ref包里還提供了ReferenceQueue。如果在創(chuàng)建SoftReference對(duì)象的時(shí)候荒澡,使用了一個(gè)ReferenceQueue對(duì)象作為參數(shù)提供給SoftReference的構(gòu)造方法报辱,如:

ReferenceQueue queue = new? ReferenceQueue();

SoftReference? ref = new? SoftReference(obj, queue);

那么當(dāng)這個(gè)SoftReference所軟引用的aMyOhject被垃圾收集器回收的同時(shí),ref所強(qiáng)引用的SoftReference對(duì)象被列入ReferenceQueue单山。也就是說(shuō)碍现,ReferenceQueue中保存的對(duì)象是Reference對(duì)象,而且是已經(jīng)失去了它所軟引用的對(duì)象的Reference對(duì)象米奸。另外從ReferenceQueue這個(gè)名字也可以看出昼接,它是一個(gè)隊(duì)列,當(dāng)我們調(diào)用它的poll()方法的時(shí)候悴晰,如果這個(gè)隊(duì)列中不是空隊(duì)列慢睡,那么將返回隊(duì)列前面的那個(gè)Reference對(duì)象逐工。

在任何時(shí)候,我們都可以調(diào)用ReferenceQueue的poll()方法來(lái)檢查是否有它所關(guān)心的非強(qiáng)可及對(duì)象被回收漂辐。如果隊(duì)列為空泪喊,將返回一個(gè)null,否則該方法返回隊(duì)列中前面的一個(gè)Reference對(duì)象。利用這個(gè)方法髓涯,我們可以檢查哪個(gè)SoftReference所軟引用的對(duì)象已經(jīng)被回收袒啼。于是我們可以把這些失去所軟引用的對(duì)象的SoftReference對(duì)象清除掉。常用的方式為:

SoftReference ref = null;

while ((ref = (EmployeeRef) q.poll()) != null) {

? ? // 清除ref

}

3. 弱引用(Weak Reference)

弱引用也是用來(lái)描述非必需對(duì)象的纬纪,當(dāng)JVM進(jìn)行垃圾回收時(shí)蚓再,無(wú)論內(nèi)存是否充足,都會(huì)回收被弱引用關(guān)聯(lián)的對(duì)象包各。在java中摘仅,用java.lang.ref.WeakReference類來(lái)表示。

4. 虛引用(Phantom Reference)

虛引用和前面的軟引用髓棋、弱引用不同实檀,它并不影響對(duì)象的生命周期惶洲。在java中用java.lang.ref.PhantomReference類表示按声。如果一個(gè)對(duì)象與虛引用關(guān)聯(lián),則跟沒(méi)有引用與之關(guān)聯(lián)一樣恬吕,在任何時(shí)候都可能被垃圾回收器回收签则。

要注意的是,虛引用必須和引用隊(duì)列關(guān)聯(lián)使用铐料,當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí)渐裂,如果發(fā)現(xiàn)它還有虛引用,就會(huì)把這個(gè)虛引用加入到與之 關(guān)聯(lián)的引用隊(duì)列中钠惩。程序可以通過(guò)判斷引用隊(duì)列中是否已經(jīng)加入了虛引用柒凉,來(lái)了解被引用的對(duì)象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個(gè)虛引用已經(jīng)被加入到引用隊(duì)列篓跛,那么就可以在所引用的對(duì)象的內(nèi)存被回收之前采取必要的行動(dòng)膝捞。

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市愧沟,隨后出現(xiàn)的幾起案子蔬咬,更是在濱河造成了極大的恐慌,老刑警劉巖沐寺,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件林艘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡混坞,警方通過(guò)查閱死者的電腦和手機(jī)狐援,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人啥酱,你說(shuō)我怎么就攤上這事场钉。” “怎么了懈涛?”我有些...
    開(kāi)封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵逛万,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我批钠,道長(zhǎng)宇植,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任埋心,我火速辦了婚禮指郁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拷呆。我一直安慰自己闲坎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布茬斧。 她就那樣靜靜地躺著腰懂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪项秉。 梳的紋絲不亂的頭發(fā)上绣溜,一...
    開(kāi)封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音娄蔼,去河邊找鬼怖喻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛岁诉,可吹牛的內(nèi)容都是我干的锚沸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涕癣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哗蜈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起属划,我...
    開(kāi)封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恬叹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后同眯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绽昼,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年须蜗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硅确。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片目溉。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菱农,靈堂內(nèi)的尸體忽然破棺而出缭付,到底是詐尸還是另有隱情,我是刑警寧澤循未,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布陷猫,位于F島的核電站,受9級(jí)特大地震影響的妖,放射性物質(zhì)發(fā)生泄漏绣檬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一嫂粟、第九天 我趴在偏房一處隱蔽的房頂上張望娇未。 院中可真熱鬧,春花似錦星虹、人聲如沸零抬。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)平夜。三九已至,卻和暖如春护糖,著一層夾襖步出監(jiān)牢的瞬間褥芒,已是汗流浹背嚼松。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工嫡良, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人献酗。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓寝受,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親罕偎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子很澄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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