雙11背后的技術 GC 的秘密

垃圾回收機制(Garbage Collection,GC)是 java語言的特性穴翩,有了 GC犬第,不用再像 c/c++ 那樣麻煩地考慮內存的分配和釋放。其實芒帕,垃圾回收機制的歷史遠遠要比java的歷史久遠歉嗓,因為在1960年誕生的Lisp是第一門應用垃圾回收機制的語言。雖然有了垃圾回收機制幫我們完成垃圾回收背蟆,但是我們還是得了解 GC 的運行機制鉴分,以便于在開發(fā)中排查內存泄露和內存溢出等問題带膀,通過優(yōu)化 GC 來提供應用的性能冠场。

即是對過內存了解的不多,您可能也聽過內存通常分為棧內存和堆內存本砰。棧和堆是兩種不同的數據結構碴裙,我們將物理的內存抽象為這兩種數據結構,便于管理內存(如何訪問內存以及內存地址間的關系)。垃圾回收機制主要作用于 java 的堆(Heap)內存舔株,堆內存也用于存放 java 對象實例莺琳,所以很多時候我們也把 java堆成為GC堆。

在程序的運行時载慈,需要在堆內存中的對象越來越多惭等,堆內存中沒有足夠的空間存放新對象。就得想辦法來回收已不再用的對象办铡,來釋放堆內存的空間辞做,那么垃圾回收機制在進行垃圾回收前,就得判斷哪些實例已不再使用寡具,哪些實例還要繼續(xù)使用秤茅,我們用可達算法來判斷對象是否存活。

在主流商用語言(如Java童叠、C#)的主流實現中, 都是通過可達性分析算法來判定對象是否存活的: 通過一系列的稱為 GC Roots 的對象作為起點, 靜態(tài)屬性和在棧內存中方法中的本地變量所引用的對象框喳。然后向下搜索,搜索所走過的路徑稱為引用鏈/Reference Chain, 當一個對象到 GC Roots 沒有任何引用鏈相連時, 即該對象不可達, 也就說明此對象是不可用的, 如下圖: Object5厦坛、6五垮、7 雖然互有關聯, 但它們到GC Roots是不可達的, 因此也會被判定為可回收的對象。

那么我們具體如何劃分堆內存的呢杜秸?現在通常做法放仗,將內存劃分一定區(qū)域,我們通常按對象存活的時間對堆內存中的對象進行劃分撬碟,這就是分代算法匙监。也是流行的 GC 算法。我們這里需要了解一個規(guī)律小作,就是大多數的對象都是來也匆匆去也匆匆亭姥,他們的存活是短暫的。所以我們新看 GC 是如何處理年輕代的內存的顾稀。我們將年輕代的內存再次細分為三部分 Eden 达罗、 survivor to? 和 survivor from 三個部分,首先我們還需了解我 GC 時通常是先對內存進行標記静秆,標記出哪些內存是不可達的粮揉,也就是他們將被 GC 掉,GC 掉那些不可達(沒有被引用的)對象后抚笔,在堆內存中會留下許多空位扶认,我們還需要處理這些空位,類似 windows 的清理磁盤碎片殊橙。我們也需要清理掉這些空位辐宾,讓內存連續(xù)狱从,這個過程大家可以理解為壓縮內存。

當 Eden 區(qū)域新生的對象過多是叠纹,就會觸發(fā) Minor GC 來清理 Eden 區(qū)的對象

我們將標記為可達對象移動到 survivor 區(qū)域季研,綠色的表示存活的對象,然后灰色對象表示不可達的對象誉察。

我們清除掉那些不再被引用的對象(灰色表示)与涡,這些綠色對象經歷一次 minor GC 的浩劫存活下來了。

隨著 Eden 的新的對象有不斷涌現持偏,我們又需要進行 minor GC 這一次我們依舊以同樣的方法來處理 Eden 中對象驼卖。

1. 將 survivor 1 中的可達對象移動到 survivor 2 中,剩下的都是不可達的對象

將 survivor 2 中的的內存標記為 2鸿秆,然后在下一次 minorGC 將為 1 的存活的對象移動到 survior 2 中酌畜,這樣好處就是我們通過來回移動對象,可以無需考慮連續(xù)性谬莹,這樣我們通過犧牲空間來換取效率,無需考慮如何壓縮內存桩了。

這樣反復幾次附帽,如果還存活的對象反復次數超過閥值就會晉升到老年代

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市井誉,隨后出現的幾起案子蕉扮,更是在濱河造成了極大的恐慌,老刑警劉巖颗圣,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喳钟,死亡現場離奇詭異,居然都是意外死亡在岂,警方通過查閱死者的電腦和手機奔则,發(fā)現死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔽午,“玉大人易茬,你說我怎么就攤上這事〖袄希” “怎么了抽莱?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骄恶。 經常有香客問我食铐,道長,這世上最難降的妖魔是什么僧鲁? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任虐呻,我火速辦了婚禮象泵,結果婚禮上,老公的妹妹穿的比我還像新娘铃慷。我一直安慰自己单芜,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布犁柜。 她就那樣靜靜地躺著洲鸠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馋缅。 梳的紋絲不亂的頭發(fā)上扒腕,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音萤悴,去河邊找鬼瘾腰。 笑死,一個胖子當著我的面吹牛覆履,可吹牛的內容都是我干的蹋盆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼硝全,長吁一口氣:“原來是場噩夢啊……” “哼栖雾!你這毒婦竟也來了?” 一聲冷哼從身側響起伟众,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤析藕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凳厢,有當地人在樹林里發(fā)現了一具尸體账胧,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年先紫,在試婚紗的時候發(fā)現自己被綠了治泥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡遮精,死狀恐怖车摄,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情仑鸥,我是刑警寧澤吮播,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站眼俊,受9級特大地震影響意狠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜疮胖,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一环戈、第九天 我趴在偏房一處隱蔽的房頂上張望闷板。 院中可真熱鬧,春花似錦院塞、人聲如沸遮晚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽县遣。三九已至,卻和暖如春汹族,著一層夾襖步出監(jiān)牢的瞬間萧求,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工顶瞒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夸政,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓榴徐,卻偏偏與公主長得像守问,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坑资,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容