Java四種引用簡(jiǎn)介

引語:

我們知道java相比C,C++中沒有令人頭痛的指針,但是卻有和指針作用相似的引用對(duì)象(Reference),就是常說的引用寇损,比如,Object obj = new Object()裳食;這個(gè)obj就是引用矛市,它指向的是真正的對(duì)象Object的地址,不過今天要說的是java中的四種引用诲祸。有人可能比較懵逼浊吏,四種引用?是的救氯,從JDK1.2之后找田,java對(duì)引用這塊的概念進(jìn)行了擴(kuò)充,按照引用的強(qiáng)度分為了四種引用:強(qiáng)引用着憨,軟引用墩衙,弱引用,虛引用甲抖。下面就讓我們來看看這四種引用都具體的情況吧漆改。

1.強(qiáng)引用

1.1介紹:

我們平時(shí)代碼中使用得最多的引用,對(duì)象的類是:StrongReference准谚。就比如上面說的Object obj = new Object()挫剑;我們?cè)偈煜げ贿^了,作為最強(qiáng)的引用氛魁,只要引用還存在著暮顺,垃圾收集器就不會(huì)將該引用給回收,即使會(huì)出現(xiàn)OOM(內(nèi)存溢出)秀存。就是說這種引用只要引用還一直指向的對(duì)象捶码,垃圾收集器是不會(huì)去管它的,所以它被稱為強(qiáng)引用或链。不過如果

Objectobj =newObject();obj =null;

obj被賦值為了null惫恼,該引用就斷了,垃圾收集器會(huì)在合適的時(shí)候回收改引用的內(nèi)存澳盐。

還有一種情況就是obj是成員變量祈纯,方法執(zhí)行完了,obj隨著被棧幀被回收了叼耙,obj引用也是一起被回收了腕窥。強(qiáng)引用的使用就不介紹了,地球人都知道筛婉。

2.軟引用

2.1介紹:

軟引用是用來描述一些有用但是非必須的對(duì)象簇爆。對(duì)應(yīng)的類是SoftReference,它被回收的時(shí)機(jī)是系統(tǒng)內(nèi)存不足的時(shí)候爽撒,如果內(nèi)存足夠入蛆,它不會(huì)被回收,內(nèi)存不足了硕勿,可能會(huì)發(fā)生OOM了哨毁,軟引用的對(duì)象就會(huì)被回收。這樣的特性是不是就像緩存源武?是的扼褪,軟引用可以用來存放緩存的數(shù)據(jù),內(nèi)存足夠的時(shí)候一直可以訪問粱栖,內(nèi)存不足的時(shí)候迎捺,需要重新創(chuàng)建或者訪問原對(duì)象。

2.2使用:

其實(shí)不管是軟引用查排,弱引用凳枝,還是虛引用,代碼中使用方式都是像下面這樣跋核,使用對(duì)應(yīng)的Reference將對(duì)象放入到構(gòu)造函數(shù)當(dāng)中岖瑰,然后使用的地方reference.get()來調(diào)用具體對(duì)象。

Objectobj =newObject();SoftReference softReference =newSoftReference<>(obj);softReference.get();

同時(shí)可以使用ReferenceQueue來把引用和引用隊(duì)列給關(guān)聯(lián)起來:

Objectobj =newObject();ReferenceQueue refQueue =newReferenceQueue<>();SoftReference softReference =newSoftReference<>(obj, refQueue);

__所謂關(guān)聯(lián)起來砂代,其實(shí)就是當(dāng)引用被回收的時(shí)候蹋订,會(huì)被添加到ReferenceQueue中,使用ReferenceQueue.poll()方法可以返回當(dāng)前可用的引用刻伊,并從隊(duì)列沖刪除__露戒。簡(jiǎn)單來說就是引用和引用隊(duì)列關(guān)聯(lián)起來(引用的構(gòu)造函數(shù)傳入隊(duì)列)椒功,然后引用被回收的時(shí)候會(huì)被添加到隊(duì)列中,然后使用poll()方法可以返回引用智什。

3.弱引用

3.1介紹:

虛引用比上面兩個(gè)引用就更菜了动漾,只要垃圾收集器掃描到了它,被弱引用關(guān)聯(lián)的對(duì)象就會(huì)被回收荠锭。被弱引用關(guān)聯(lián)對(duì)象的生命周期其實(shí)就是從對(duì)象創(chuàng)建到下一次垃圾回收旱眯。對(duì)應(yīng)的類是WeakReference。

3.2使用:

publicstaticvoidmain(String[] args) throws InterruptedException{? ? ? Object obj =newObject();? ? ? ReferenceQueue refQueue =newReferenceQueue<>();? ? ? WeakReference weakRef =newWeakReference<>(obj, refQueue);? ? ? System.out.println("引用:"+ weakRef.get());? ? ? System.out.println("隊(duì)列中的東西:"+ refQueue.poll());// 清除強(qiáng)引用, 觸發(fā)GCobj =null;? ? ? System.gc();? ? ? Thread.sleep(200);? ? ? System.out.println("引用:"+ weakRef.get());? ? ? System.out.println("引用加入隊(duì)列了嗎证九? "+ weakRef.isEnqueued());? ? ? System.out.println("隊(duì)列中的東西:"+ refQueue.poll());/**

? ? ? * 輸出結(jié)果

? ? ? * 引用:java.lang.Object@7bb11784

? ? ? * 隊(duì)列中的東西:null

? ? ? * 引用:null

? ? ? * 引用加入隊(duì)列了嗎删豺? true

? ? ? * 隊(duì)列中的東西:java.lang.ref.WeakReference@33a10788

? ? ? */}

可以看到當(dāng)強(qiáng)引用被清除,手動(dòng)觸發(fā)GC后愧怜,弱引用回收呀页,被加入到隊(duì)列中了。

3.3擴(kuò)展:

WeakHashMap跟hashMap很像拥坛,差別就在于赔桌,當(dāng)WeakHashMap的key(弱引用),指向的對(duì)象被回收了渴逻,weakhashMap中的對(duì)象也就消失了疾党。不會(huì)和HashMap一樣一直持有該對(duì)象,導(dǎo)致無法回收惨奕。

不贅述了雪位,有興趣的可以了解一下,?WeakHashMap?梨撞。

4.虛引用

4.1介紹:

虛引用是最弱的一種引用雹洗,它不會(huì)影響對(duì)象的生命周期,對(duì)象被回收跟它沒啥關(guān)系卧波。它引用的對(duì)象可以在任何時(shí)候被回收时肿,而且也無法根據(jù)虛引用來取得一個(gè)對(duì)象的實(shí)例。僅僅當(dāng)它指向的對(duì)象被回收的時(shí)候港粱,它會(huì)受到一個(gè)通知螃成。對(duì)應(yīng)的類是PhantomReference。

4.2使用:

有人就要問既然對(duì)對(duì)象回收沒影響查坪,那它有啥用(其實(shí)用處很少)寸宏,我查閱網(wǎng)上的資料說是,可以用來監(jiān)控對(duì)象的回收偿曙,和記錄日志氮凝。簡(jiǎn)單點(diǎn)說就是對(duì)象被回收的時(shí)候,和虛引用相關(guān)的隊(duì)列知道了實(shí)例對(duì)象被回收了望忆。這個(gè)時(shí)候我們可以記錄下來罩阵,知道對(duì)象是什么時(shí)候被回收的竿秆。

從而起到監(jiān)控的作用。

publicstaticvoidmain(String[] args) throws Exception {Objectabc =newObject();? ? ? ReferenceQueue refQueue =newReferenceQueue();? ? ? PhantomReference abcRef =newPhantomReference(abc, refQueue);? ? ? System.out.println("隊(duì)列中的東西:"+ refQueue.poll());? ? ? abc =null;? ? ? System.gc();? ? ? Thread.sleep(1000);? ? ? System.out.println("引用加入隊(duì)列了嗎稿壁? "+ abcRef.isEnqueued());? ? ? System.out.println("隊(duì)列中的東西:"+ refQueue.poll());/**

? ? ? ? * 輸出:

? ? ? ? * 隊(duì)列中的東西:null

? ? ? ? * 引用加入隊(duì)列了嗎幽钢? true

? ? ? ? * 隊(duì)列中的東西:java.lang.ref.PhantomReference@7bb11784

? ? ? ? */}

發(fā)現(xiàn)隊(duì)列中有引用了,就可以添加日志記錄了常摧。

5.總結(jié):

將人比作垃圾收集器,引用比作食物威创,我們來總結(jié)下四種引用:

強(qiáng)引用是毒藥落午,即使你很餓了你也不會(huì)去吃它;

軟引用是零食肚豺,不餓的時(shí)候不吃溃斋,餓了饑不擇食,零食也能填飽肚子吸申;

弱引用是飯菜梗劫,到了吃飯時(shí)間(垃圾回收),就吃飯菜截碴;

虛引用是剩菜梳侨,當(dāng)你吃完東西(回收完對(duì)象),就回剩下剩菜日丹,別人就知道你吃過飯了走哺。

我自己是一個(gè)從事了6年的Java全棧工程師,最近整理了一套適合2019年學(xué)習(xí)的Java\大數(shù)據(jù)資料哲虾,從基礎(chǔ)的Java丙躏、大數(shù)據(jù)面向?qū)ο蟮竭M(jìn)階的框架知識(shí)都有整理哦,可以來我的主頁免費(fèi)領(lǐng)取哦束凑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晒旅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子汪诉,更是在濱河造成了極大的恐慌废恋,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒寄,死亡現(xiàn)場(chǎng)離奇詭異拴签,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旗们,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蚓哩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人上渴,你說我怎么就攤上這事岸梨∠舶洌” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵曹阔,是天一觀的道長(zhǎng)半开。 經(jīng)常有香客問我,道長(zhǎng)赃份,這世上最難降的妖魔是什么寂拆? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮抓韩,結(jié)果婚禮上纠永,老公的妹妹穿的比我還像新娘。我一直安慰自己谒拴,他們只是感情好尝江,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著英上,像睡著了一般炭序。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苍日,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天惭聂,我揣著相機(jī)與錄音,去河邊找鬼相恃。 笑死彼妻,一個(gè)胖子當(dāng)著我的面吹牛误堡,可吹牛的內(nèi)容都是我干的饭于。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼处铛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼揩魂!你這毒婦竟也來了幽邓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤火脉,失蹤者是張志新(化名)和其女友劉穎牵舵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倦挂,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畸颅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了方援。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片没炒。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖犯戏,靈堂內(nèi)的尸體忽然破棺而出送火,到底是詐尸還是另有隱情拳话,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布种吸,位于F島的核電站弃衍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坚俗。R本人自食惡果不足惜镜盯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猖败。 院中可真熱鬧速缆,春花似錦、人聲如沸辙浑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽判呕。三九已至,卻和暖如春送滞,著一層夾襖步出監(jiān)牢的瞬間侠草,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工犁嗅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留边涕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓褂微,卻偏偏與公主長(zhǎng)得像功蜓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宠蚂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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