JAVA的內(nèi)存分配和垃圾收集3:如何枚舉根節(jié)點(diǎn)

我們知道欧瘪,在分析一個(gè)對象是否是存活的時(shí)候有兩種方法眷射,一個(gè)是引用計(jì)數(shù)法,引用計(jì)數(shù)法雖然實(shí)現(xiàn)簡單并且效率較高佛掖,但是很難解決循環(huán)引用妖碉。所以目前主流的虛擬機(jī)都是使用的是:可達(dá)性分析法。在可達(dá)性分析法中對象能被回收的條件是沒有引用來引用它苦囱,要做到這點(diǎn)就需要得到所有的GC Roots節(jié)點(diǎn)嗅绸,來從GC Root來遍歷∷和可作為GC Root的主要是全局性引用(例如常量和靜態(tài)變量)鱼鸠,與執(zhí)行上下文(棧幀中的本地變量表)中猛拴。那么如何在這么多的全局變量和棧中的局部變量表中找到棧上的根節(jié)點(diǎn)呢?

在棧中只有一部分?jǐn)?shù)據(jù)是Reference(引用)類型蚀狰,那些非Reference的類型的數(shù)據(jù)對于找到根節(jié)點(diǎn)沒有什么用處愉昆,如果我們對棧全部掃描一遍這是相當(dāng)浪費(fèi)時(shí)間和資源的事情。

那怎么做可以減少回收時(shí)間呢麻蹋?我們很自然的想到可以用空間來換取時(shí)間跛溉,我們可以在某個(gè)位置把棧上代表引用的位置記錄下來,這樣在gc發(fā)生的時(shí)候就不用全部掃描了扮授,在HotSpot中使用的是一種叫做OopMap的數(shù)據(jù)結(jié)構(gòu)來記錄的芳室。對于OopMap可以簡單的理解是存放調(diào)試信息的對象。

在OopMap的協(xié)助下刹勃,我們可以快速的完成GC Roots枚舉堪侯,但我們也不能隨時(shí)隨地都生成OopMap,那樣一方面會(huì)需要更多的空間來存放這些對象荔仁,另一方面效率也會(huì)簡單低下伍宦。所以只會(huì)在特定的位置來記錄一下,主要是正在:

  1. 循環(huán)的末尾
  2. 方法臨返回前/調(diào)用方法的call指令后
  3. 可能拋異常的位置

這些位置稱為安全點(diǎn)乏梁。

關(guān)于安全點(diǎn)
我們在做GC的時(shí)候需要讓jvm停在某個(gè)時(shí)間點(diǎn)上次洼,如果不是這樣我們在分析對象間的引用關(guān)系的時(shí)候,引用關(guān)系還在不斷的變化遇骑。這樣我們的準(zhǔn)確性就無法得到保證卖毁。 安全點(diǎn)就是所有的線程在要GC的時(shí)候停頓的位置。那么如何讓所有的線程都到安全點(diǎn)上在停頓下來呢质蕉?這里有兩種方案可以選擇:

  1. 搶先式中斷
  2. 主動(dòng)式中斷

在搶先式中斷中不需要線程主動(dòng)配合势篡,在GC發(fā)生的時(shí)候就讓所有線程都中斷,如果發(fā)現(xiàn)哪個(gè)線程中斷的地方不在安全點(diǎn)上模暗,那么就恢復(fù)線程禁悠,然后讓它跑到安全點(diǎn)上。
而主動(dòng)式中斷是讓GC在需要中斷線程的時(shí)候不直接對線程操作兑宇,設(shè)置一個(gè)標(biāo)志碍侦,讓各個(gè)線程主動(dòng)輪詢這個(gè)標(biāo)志,如果中斷標(biāo)志位真時(shí)就讓自己中斷隶糕。

目前幾乎沒有虛擬機(jī)采用搶先式中斷了瓷产。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枚驻,隨后出現(xiàn)的幾起案子濒旦,更是在濱河造成了極大的恐慌,老刑警劉巖再登,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尔邓,死亡現(xiàn)場離奇詭異晾剖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)梯嗽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門齿尽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灯节,你說我怎么就攤上這事循头。” “怎么了炎疆?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵卡骂,是天一觀的道長。 經(jīng)常有香客問我形入,道長偿警,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任唯笙,我火速辦了婚禮,結(jié)果婚禮上盒使,老公的妹妹穿的比我還像新娘崩掘。我一直安慰自己,他們只是感情好少办,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布苞慢。 她就那樣靜靜地躺著,像睡著了一般英妓。 火紅的嫁衣襯著肌膚如雪挽放。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天蔓纠,我揣著相機(jī)與錄音辑畦,去河邊找鬼。 笑死腿倚,一個(gè)胖子當(dāng)著我的面吹牛纯出,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敷燎,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼暂筝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硬贯?” 一聲冷哼從身側(cè)響起焕襟,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饭豹,沒想到半個(gè)月后鸵赖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體务漩,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年卫漫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菲饼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡列赎,死狀恐怖宏悦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情包吝,我是刑警寧澤饼煞,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站诗越,受9級特大地震影響砖瞧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嚷狞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一块促、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧床未,春花似錦竭翠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啃洋,卻和暖如春传货,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宏娄。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工问裕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孵坚。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓僻澎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親十饥。 傳聞我的和親對象是個(gè)殘疾皇子窟勃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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