如何判斷對象不可達

查找內(nèi)存中不再使用的對象

引用計數(shù)法

引用計數(shù)法就是如果一個對象沒有被任何引用指向嘴高,則可視之為垃圾炮姨。這種方法的缺點就是不能檢測到環(huán)的存在。

public class MyObject {
    public Object ref = null;
    public static void main(String[] args) {
        MyObject myObject1 = new MyObject();
        MyObject myObject2 = new MyObject();
        myObject1.ref = myObject2;
        myObject2.ref = myObject1;
        myObject1 = null;
        myObject2 = null;
    }
}

這里寫圖片描述

如果采用的是引用計數(shù)算法:
再回到前面代碼GcDemo的main方法共分為6個步驟:
Step1:GcObject實例1的引用計數(shù)加1,實例1的引用計數(shù)=1殊者;
Step2:GcObject實例2的引用計數(shù)加1,實例2的引用計數(shù)=1验夯;
Step3:GcObject實例2的引用計數(shù)再加1猖吴,實例2的引用計數(shù)=2;
Step4:GcObject實例1的引用計數(shù)再加1挥转,實例1的引用計數(shù)=2海蔽;
執(zhí)行到Step 4,則GcObject實例1和實例2的引用計數(shù)都等于2绑谣。
接下來繼續(xù)結(jié)果圖:


這里寫圖片描述

Step5:棧幀中obj1不再指向Java堆党窜,GcObject實例1的引用計數(shù)減1,結(jié)果為1借宵;
Step6:棧幀中obj2不再指向Java堆幌衣,GcObject實例2的引用計數(shù)減1,結(jié)果為1壤玫。
到此豁护,發(fā)現(xiàn)GcObject實例1和實例2的計數(shù)引用都不為0哼凯,那么如果采用的引用計數(shù)算法的話,那么這兩個實例所占的內(nèi)存將得不到釋放楚里,這便產(chǎn)生了內(nèi)存泄露断部。

根搜索算法

這是目前主流的虛擬機都是采用GC Roots Tracing算法,比如Sun的Hotspot虛擬機便是采用該算法腻豌。 該算法的核心算法是從GC Roots對象作為起始點家坎,利用數(shù)學中圖論知識,圖中可達對象便是存活對象吝梅,而不可達對象則是需要回收的垃圾內(nèi)存虱疏。這里涉及兩個概念,一是GC Roots苏携,一是可達性做瞪。

GCroots的節(jié)點:全局性的引用(常量或靜態(tài)屬性)與執(zhí)行上下文(例如棧幀中的局部變量表中)
那么可以作為GC Roots的對象(見下圖):

  • 虛擬機棧的棧幀的局部變量表所引用的對象;
  • 本地方法棧的JNI所引用的對象右冻;
  • 方法區(qū)的靜態(tài)變量和常量所引用的對象装蓬;

關(guān)于可達性的對象,便是能與GC Roots構(gòu)成連通圖的對象纱扭,如下圖:

這里寫圖片描述

根搜索算法的基本思路就是通過一系列名為”GC Roots”的對象作為起始點牍帚,從這些節(jié)點開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain)乳蛾,當一個對象到GC Roots沒有任何引用鏈相連時暗赶,則證明此對象是不可用的。

從上圖肃叶,reference1蹂随、reference2、reference3都是GC Roots因惭,可以看出:
reference1-> 對象實例1岳锁;
reference2-> 對象實例2;
reference3-> 對象實例4蹦魔;
reference3-> 對象實例4 -> 對象實例6激率;
可以得出對象實例1、2版姑、4柱搜、6都具有GC Roots可達性,也就是存活對象剥险,不能被GC回收的對象聪蘸。
而對于對象實例3、5直接雖然連通,但并沒有任何一個GC Roots與之相連健爬,這便是GC Roots不可達的對象控乾,這就是GC需要回收的垃圾對象。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娜遵,一起剝皮案震驚了整個濱河市蜕衡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌设拟,老刑警劉巖慨仿,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纳胧,居然都是意外死亡镰吆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門跑慕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來万皿,“玉大人,你說我怎么就攤上這事核行±喂瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵芝雪,是天一觀的道長减余。 經(jīng)常有香客問我,道長惩系,這世上最難降的妖魔是什么佳励? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蛆挫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妙黍。我一直安慰自己悴侵,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布拭嫁。 她就那樣靜靜地躺著可免,像睡著了一般。 火紅的嫁衣襯著肌膚如雪做粤。 梳的紋絲不亂的頭發(fā)上浇借,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音怕品,去河邊找鬼妇垢。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的闯估。 我是一名探鬼主播灼舍,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涨薪!你這毒婦竟也來了骑素?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刚夺,失蹤者是張志新(化名)和其女友劉穎献丑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侠姑,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡创橄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了结借。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筐摘。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖船老,靈堂內(nèi)的尸體忽然破棺而出咖熟,到底是詐尸還是另有隱情,我是刑警寧澤柳畔,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布馍管,位于F島的核電站,受9級特大地震影響薪韩,放射性物質(zhì)發(fā)生泄漏确沸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一俘陷、第九天 我趴在偏房一處隱蔽的房頂上張望罗捎。 院中可真熱鬧,春花似錦拉盾、人聲如沸桨菜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倒得。三九已至,卻和暖如春夭禽,著一層夾襖步出監(jiān)牢的瞬間霞掺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工讹躯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菩彬,地道東北人缠劝。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像挤巡,于是被迫代替她去往敵國和親剩彬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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