JAVA中的四種引用

在java中,有四種引用边酒,分別為強引用经柴、軟引用、弱引用與虛引用墩朦,它們有各自不同的特性坯认,使用場景也各不相同,下面我就對他們分別作出說明氓涣。

強引用

強引用是最普遍的引用鹃操。如果對象具有強引用,那么垃圾回收器絕不會回收它春哨。當內(nèi)存空間不足時,jvm寧愿OOM也不會隨意回收具有強引用的對象恩伺。如果強引用的對象不使用時赴背,需要將它弱化從而使GC能夠回收它。比如顯示的將它置為null;或者讓其超出對象的生命周期范圍凰荚,那么GC就認為該對象不存在引用燃观,這時就能回收它了。具體什么時候回收就要取決于GC算法了便瑟。

   public void test(){
       // 強引用
       Object strongReference = new Object();
   } 

在一個方法內(nèi)部有一個強引用缆毁,這個引用保存在中,而引用的對象保存在中到涂。當這個方法運行完成后脊框,就會退出方法棧,引用對象的引用數(shù)就是0践啄,這個對象就可以被回收浇雹。
但是如果這個對象是全局變量時,就需要在不使用時將其置為null屿讽,否則無法被垃圾回收昭灵。

軟引用

如果一個對象只具有軟引用,則內(nèi)存空間充足時伐谈,垃圾回收不會回收它烂完;如果內(nèi)存空間不足時,就會回收這些對象诵棵。只要垃圾回收沒有回收它抠蚣,該對象就可以被程序使用。

       // 強引用
       String strongReference = new String("123");
       // 軟引用
       String str = new String("123");
       SoftReference<String> softReference = new SoftReference<>(str);

當內(nèi)存不足時非春,jvm會首先將軟引用的對象引用置為null柱徙,然后通知垃圾回收器進行回收。而且jvm會盡可能的優(yōu)先回收長時間閑置不用的軟引用對象奇昙。對那些剛構(gòu)建或剛使用過的軟引用對象會盡可能保留护侮。為此引入了引用隊列(ReferenceQueue)的概念。如果軟引用的對象被垃圾回收储耐,jvm就會把這個軟引用加入到與之關(guān)聯(lián)的引用隊列中羊初。

弱引用

弱引用與軟引用的區(qū)別在于:只具有弱引用的對象擁有更短的生命周期。在垃圾回收器進行掃描時什湘,一旦發(fā)現(xiàn)只有弱引用的對象长赞,不管內(nèi)存空間是否充足,都會回收它闽撤。不過得哆,垃圾回收器是一個優(yōu)先級很低的線程,因此不一定很快就能發(fā)現(xiàn)那些只有弱引用的對象哟旗。

     // 弱引用
     String str = new String("123");
     WeakReference<String> weakReference = new WeakReference<>(str);

如果一個對象很少被使用贩据,并且希望在使用時隨時就能獲得栋操,但又不想影響此對象的垃圾回收,那么就可以用WeakReference來記住此對象饱亮。

如果你希望將一個弱引用變成強引用矾芙,可以使用weakReference.get();

      // 弱引用
      String str = new String("123");
      WeakReference<String> weakReference = new WeakReference<>(str);
      // 弱引用轉(zhuǎn)強引用
      String strongReference = weakReference.get();

同樣,如弱引用的對象被垃圾回收近上,jvm就會把這個弱引用加入到與之關(guān)聯(lián)的引用隊列中剔宪。

虛引用

虛引用顧名思義,就是形同虛設(shè)壹无。虛引用并不會決定對象的生命周期葱绒,如果一個對象只有虛引用,那它就和沒有任何引用一樣格遭,在任何時候都可以被垃圾回收器回收哈街。

虛引用必須和引用隊列聯(lián)合使用。當垃圾回收器回收一個對象時拒迅,如果發(fā)現(xiàn)他有虛引用骚秦,就會在回收對象前,把虛引用加入與之關(guān)聯(lián)的引用隊列中璧微。

       String str = new String("123");
       // 引用隊列
       ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
       // 虛引用
       PhantomReference<String> phantomReference = new PhantomReference<>(str,referenceQueue);

虛引用主要用來跟蹤對象被垃圾回收的活動作箍。程序可以通過判斷引用隊列中是否已經(jīng)加入了虛引用,來了解被引用的對象是否要進行垃圾回收前硫。如果程序發(fā)現(xiàn)某個虛引用已經(jīng)被加入到引用隊列胞得,那么就可以在所引用的對象的內(nèi)存被回收之前采取必要的行動。

總結(jié)

引用級別強 -> 弱 : 強引用 -> 軟引用 -> 弱引用 -> 虛引用

引用類型 被垃圾回收時間 用途 生存時間
強引用 從不會 對象的一般狀態(tài) jvm終止
軟引用 內(nèi)存不足時屹电,先回收長時間不用的 對象緩存 內(nèi)存不足
弱引用 垃圾回收時 對象緩存 垃圾回收
虛引用 垃圾回收時 跟蹤對象的垃圾回收 垃圾回收
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阶剑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子危号,更是在濱河造成了極大的恐慌牧愁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外莲,死亡現(xiàn)場離奇詭異猪半,居然都是意外死亡,警方通過查閱死者的電腦和手機偷线,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門磨确,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人声邦,你說我怎么就攤上這事乏奥。” “怎么了亥曹?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵邓了,是天一觀的道長盏檐。 經(jīng)常有香客問我,道長驶悟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任材失,我火速辦了婚禮痕鳍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘龙巨。我一直安慰自己笼呆,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布旨别。 她就那樣靜靜地躺著诗赌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秸弛。 梳的紋絲不亂的頭發(fā)上铭若,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音递览,去河邊找鬼叼屠。 笑死,一個胖子當著我的面吹牛绞铃,可吹牛的內(nèi)容都是我干的镜雨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼儿捧,長吁一口氣:“原來是場噩夢啊……” “哼荚坞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起菲盾,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤颓影,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亿汞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞭空,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年疗我,在試婚紗的時候發(fā)現(xiàn)自己被綠了咆畏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吴裤,死狀恐怖旧找,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情麦牺,我是刑警寧澤钮蛛,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布鞭缭,位于F島的核電站,受9級特大地震影響魏颓,放射性物質(zhì)發(fā)生泄漏岭辣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一甸饱、第九天 我趴在偏房一處隱蔽的房頂上張望沦童。 院中可真熱鬧,春花似錦叹话、人聲如沸偷遗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氏豌。三九已至,卻和暖如春热凹,著一層夾襖步出監(jiān)牢的瞬間泵喘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工碌嘀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涣旨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓股冗,卻偏偏與公主長得像霹陡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子止状,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 四種引用類型 強引用(StrongReference)強引用就是指在程序代碼之中普遍存在的烹棉,比如下面這段代碼中的o...
    leilifengxingmw閱讀 3,807評論 0 2
  • Java中有四種引用類型:StrongReference(強引用),SoftReference(軟引用)怯疤,Weak...
    zhong0316閱讀 234評論 0 2
  • 1 強引用特點:我們平常典型編碼Object obj = new Object()中的obj就是強引用浆洗。通過關(guān)鍵字...
    蒼蠅拍拍閱讀 103評論 0 0
  • 1,強引用 Java應(yīng)用中默認的引用類型即為強引用類型集峦,強引用類型引用的數(shù)據(jù)在內(nèi)存空間不足的時候也不會被回收伏社,直到...
    marmot_z閱讀 132評論 0 0
  • 一、Java中的四種引用類型 JDK 1.2 開始 Java 提供了四種引用類型塔淤,分別是強引用摘昌、軟引用、弱引用高蜂、虛...
    lxbnjupt閱讀 368評論 0 0