Java中引用級別詳解

介紹

在Java中操作對象都需要用到引用類似于C++中的指針,可以說在Java語言中無時無刻不在和引用打交道在Java 1.2版本中就加入了四種不同級別的引用供開發(fā)人員使用逆济,分別是強應(yīng)用 軟引用 弱引用 幽靈引用 強度從高到低。

引用級別作用

引用級別的高低起到了JVM在內(nèi)存不足的時候娇掏,進行GC操作是否需要回收這個對象的作用蛮浑。

強引用

強引用在開發(fā)中是使用最為普遍的引用級別,當(dāng)使用new obj關(guān)鍵字創(chuàng)建了對象后鄙信,這個對象就屬于強引用了。 如果JVM在內(nèi)存不足情況下進行垃圾回收操作時遇到了強引用的對象忿晕,JVM就算拋出OutOfMemoryError錯誤導(dǎo)致程序終止装诡,也不會去回收一個具有強引用級別的對象來解決內(nèi)存不足的問題。

創(chuàng)建一個DataTest類覆蓋object的finalize方法践盼,finalize是當(dāng)GC回收當(dāng)前對象的時候會調(diào)用鸦采,但是不一定每次都會調(diào)用。

    class DataTest extends Object {

            @Override
            protected void finalize() throws Throwable {
                super.finalize();
                System.out.println("--------obj is gc--------");
            }
        }

模擬大量消耗內(nèi)存

    public static void drainMemory() {
            String[] array = new String[1024 * 10];
            for(int i = 0; i < 1024 * 10; i++) {
                for(int j = 'a'; j <= 'z'; j++) {
                    array[i] += (char)j;
                }
            }
        }

測試

      @Test
      public void onRTre() {
          DataTest dataTest = new DataTest();
          drainMemory();
      }

運行結(jié)果: 消耗了大量內(nèi)存也沒有回收對象
無任何輸入

把引用賦為null

      @Test
       public void onRTre() {
           DataTest dataTest = new DataTest();
           dataTest=null;
           drainMemory();

       }

運行結(jié)果: 隱式GC消耗大量內(nèi)存導(dǎo)致內(nèi)存不足咕幻,回收了無引用對象
--------obj is gc--------


 @Test
       public void onRTre() {
           DataTest dataTest = new DataTest();
           dataTest=null;
           System.gc();

       }

運行結(jié)果: 顯式GC操作渔伯,雖然內(nèi)存足夠也回收了無引用對象。
--------obj is gc--------

軟引用

具有軟引用的對象肄程,當(dāng)JVM內(nèi)存足夠的情況下是不會回收它锣吼,當(dāng)內(nèi)存不足情況下GC操作JVM就會回收具有軟引用的對象选浑,軟引用可以用來做那些需要緩存的操作,當(dāng)JVM內(nèi)存不足的時候這些緩存可以被GC掉玄叠。

       @Test
       public void onRTre() {
          SoftReference reference = new SoftReference(new DataTest());
          drainMemory();

       }

運行結(jié)果:運行五次古徒,有一次輸出。說明GC遇到軟引用的時候是由JVM運行情況決定读恃,是否需要回收軟引用對象隧膘,內(nèi)存不足有可能會回收也有可能不會被回收。如果當(dāng)前對象被GC對象就不能被使用了寺惫,否則可以繼續(xù)使用疹吃。
--------obj is gc--------

弱引用

弱引用級別的對象,只有JVM進行GC操作的時候遇到是弱引用級別西雀,不管內(nèi)存是否足夠都會把對象GC掉萨驶。不過由于GC是在一個級別很低的線程,所以不一定能馬上發(fā)現(xiàn)那些弱引用的對象艇肴。

       @Test
        public void onRTre() {
            WeakReference reference = new WeakReference(new DataTest());
            System.gc();

        }

運行結(jié)果:有輸出
進行GC操作雖然內(nèi)存足夠腔呜,但是對象也被回收了。
--------obj is gc--------

虛引用

這個級別的引用是最低的豆挽,具有這個級別的引用和沒被引用一樣育谬,隨時都有可能被GC掉券盅。虛引用必須和引用隊列 (ReferenceQueue)聯(lián)合使用帮哈。當(dāng)垃圾回收器準備回收一個對象時,如果發(fā)現(xiàn)它還有虛引用锰镀,就會在回收對象的內(nèi)存之前娘侍,把這個虛引用加入到與之 關(guān)聯(lián)的引用隊列中。

       @Test
       public void onRTre() {
            PhantomReference reference = new PhantomReference(new DataTest(),new ReferenceQueue());
            System.gc();

        }

運行結(jié)果:有輸出進行GC操作雖然內(nèi)存足夠泳炉,但是對象也被回收了憾筏。
--------obj is gc--------

總結(jié)

根據(jù)上面的實驗結(jié)果可以得出下面的區(qū)別

級別 回收時機 用途 存活時間
強引用 從來不會 一般使用 JVM終止時
軟引用 在內(nèi)存不足時 一般時候或者緩存 內(nèi)存不足時
弱引用 垃圾回收時 一般使用或者對象緩存 GC操作時終止
虛引用 未知 未知 未知
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市花鹅,隨后出現(xiàn)的幾起案子氧腰,更是在濱河造成了極大的恐慌,老刑警劉巖刨肃,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件古拴,死亡現(xiàn)場離奇詭異,居然都是意外死亡真友,警方通過查閱死者的電腦和手機黄痪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盔然,“玉大人桅打,你說我怎么就攤上這事是嗜。” “怎么了挺尾?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵鹅搪,是天一觀的道長。 經(jīng)常有香客問我潦嘶,道長涩嚣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任掂僵,我火速辦了婚禮航厚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锰蓬。我一直安慰自己幔睬,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布芹扭。 她就那樣靜靜地躺著麻顶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舱卡。 梳的紋絲不亂的頭發(fā)上辅肾,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音轮锥,去河邊找鬼矫钓。 笑死,一個胖子當(dāng)著我的面吹牛舍杜,可吹牛的內(nèi)容都是我干的新娜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼既绩,長吁一口氣:“原來是場噩夢啊……” “哼概龄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饲握,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤私杜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后救欧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衰粹,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年颜矿,在試婚紗的時候發(fā)現(xiàn)自己被綠了寄猩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡骑疆,死狀恐怖田篇,靈堂內(nèi)的尸體忽然破棺而出替废,到底是詐尸還是另有隱情,我是刑警寧澤泊柬,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布椎镣,位于F島的核電站,受9級特大地震影響兽赁,放射性物質(zhì)發(fā)生泄漏状答。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一刀崖、第九天 我趴在偏房一處隱蔽的房頂上張望惊科。 院中可真熱鬧,春花似錦亮钦、人聲如沸馆截。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜡娶。三九已至,卻和暖如春映穗,著一層夾襖步出監(jiān)牢的瞬間窖张,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工蚁滋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宿接,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓枢赔,卻偏偏與公主長得像澄阳,于是被迫代替她去往敵國和親拥知。 傳聞我的和親對象是個殘疾皇子踏拜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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