JAVA垃圾回收機(jī)制

  1. 為什么要了解垃圾回收涉波?
    當(dāng)需要排查各種內(nèi)存溢出、內(nèi)存泄漏問題胧瓜,當(dāng)垃圾收集成為系統(tǒng)達(dá)到更高并發(fā)量的瓶頸時(shí),就需要進(jìn)行必要的監(jiān)控和調(diào)節(jié)瘾晃。

  2. 什么時(shí)候回收贷痪?

2.1 引用計(jì)數(shù)法:每當(dāng)一個(gè)地方引用它時(shí),計(jì)數(shù)器值就加1蹦误;當(dāng)引用失效時(shí)劫拢,計(jì)數(shù)器減1;但無法解決對象循環(huán)引用的問題
2.2 可達(dá)性分析算法:對任何“活”的對象强胰,一定能最終追溯到其存活在堆棽詹祝或靜態(tài)存儲(chǔ)區(qū)之中的引用。即一定有一條引用鏈可以將一個(gè)對象連到GC Roots偶洋。
可以作為GC Roots的對象包括:虛擬機(jī)棧(本地變量表)中引用的對象熟吏;方法區(qū)中類靜態(tài)屬性引用的對象和常量引用的對象;本地方法棧中JNI(即Native方法)引用的對象。

  1. 怎么回收牵寺?
    3.1 JAVA堆:新生代(Young)悍引、老年代(Old)
    新聲代又被劃分為三個(gè)區(qū)域:Eden、From Survivor帽氓、To Survivor趣斤。
    image.png

3.2 Minor GC 是發(fā)生在新生代中的垃圾收集動(dòng)作,所采用的是復(fù)制算法黎休。
Full GC 是發(fā)生在老年代的垃圾收集動(dòng)作浓领,所采用的是標(biāo)記-清除算法

當(dāng)對象在 Eden ( 包括一個(gè) Survivor 區(qū)域,這里假設(shè)是 from 區(qū)域 ) 出生后势腮,在經(jīng)過一次 Minor GC 后联贩,如果對象還存活,并且能夠被另外一塊 Survivor 區(qū)域所容納( 上面已經(jīng)假設(shè)為 from 區(qū)域捎拯,這里應(yīng)為 to 區(qū)域泪幌,即 to 區(qū)域有足夠的內(nèi)存空間來存儲(chǔ) Eden 和 from 區(qū)域中存活的對象 ),則使用復(fù)制算法將這些仍然還存活的對象復(fù)制到另外一塊 Survivor 區(qū)域 ( 即 to 區(qū)域 ) 中玄渗,然后清理所使用過的 Eden 以及 Survivor 區(qū)域 ( 即 from 區(qū)域 )座菠,并且將這些對象的年齡設(shè)置為1,以后對象在 Survivor 區(qū)每熬過一次 Minor GC藤树,就將對象的年齡 + 1浴滴,當(dāng)對象的年齡達(dá)到某個(gè)值時(shí) ( 默認(rèn)是 15 歲,可以通過參數(shù) -XX:MaxTenuringThreshold 來設(shè)定 )岁钓,這些對象就會(huì)成為老年代升略。
但這也不是一定的,對于一些較大的對象 ( 即需要分配一塊較大的連續(xù)內(nèi)存空間 ) 則是直接進(jìn)入到老年代屡限。

在辨別出需要回收的對象后品嚣,JAVA虛擬機(jī)在回收時(shí)有不同做法。
“停止-復(fù)制”钧大。先暫停程序的運(yùn)行翰撑,然后將所有存活的對象從當(dāng)前堆一個(gè)挨著一個(gè)復(fù)制到另一個(gè)堆。
采用這種方式時(shí)啊央,新堆將保持緊湊排列眶诈。但在效率上卻存在問題,第一瓜饥,需要多一倍的維護(hù)空間逝撬;第二,當(dāng)程序進(jìn)入穩(wěn)定狀態(tài)后乓土,可能只會(huì)產(chǎn)生少量垃圾宪潮,甚至沒有垃圾溯警,此時(shí),復(fù)制式回收器仍然會(huì)將所有內(nèi)存自一處復(fù)制到另一處狡相。
“標(biāo)記-清掃”梯轻。在尋找存活對象的過程中,對每一個(gè)存活對象打標(biāo)記谣光。當(dāng)標(biāo)記工作完成后檩淋,沒有被標(biāo)記的對象將被清理。
采用這種方式萄金,在效率上有了很大的提升,但清理后剩下的堆空間是不連續(xù)的媚朦。
實(shí)際上氧敢,JAVA虛擬機(jī)在清理垃圾時(shí)采用一種“自適應(yīng)”技術(shù)。
JAVA虛擬機(jī)會(huì)對回收操作進(jìn)行監(jiān)控询张,當(dāng)對象很穩(wěn)定孙乖,垃圾很少,回收效率降低時(shí)份氧,切換到“標(biāo)記-清掃”方式唯袄。當(dāng)堆空間出現(xiàn)很多碎片時(shí),就會(huì)切換回“停止-復(fù)制”方式蜗帜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恋拷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子厅缺,更是在濱河造成了極大的恐慌蔬顾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湘捎,死亡現(xiàn)場離奇詭異诀豁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窥妇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門舷胜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人活翩,你說我怎么就攤上這事烹骨。” “怎么了纱新?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵展氓,是天一觀的道長。 經(jīng)常有香客問我脸爱,道長遇汞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮空入,結(jié)果婚禮上络它,老公的妹妹穿的比我還像新娘。我一直安慰自己歪赢,他們只是感情好化戳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埋凯,像睡著了一般点楼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上白对,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天掠廓,我揣著相機(jī)與錄音,去河邊找鬼甩恼。 笑死蟀瞧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的条摸。 我是一名探鬼主播悦污,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钉蒲!你這毒婦竟也來了切端?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤子巾,失蹤者是張志新(化名)和其女友劉穎帆赢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體线梗,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椰于,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仪搔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘾婿。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烤咧,靈堂內(nèi)的尸體忽然破棺而出偏陪,到底是詐尸還是另有隱情,我是刑警寧澤煮嫌,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布笛谦,位于F島的核電站,受9級特大地震影響昌阿,放射性物質(zhì)發(fā)生泄漏饥脑。R本人自食惡果不足惜恳邀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灶轰。 院中可真熱鬧谣沸,春花似錦、人聲如沸笋颤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伴澄。三九已至赋除,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秉版,已是汗流浹背贤重。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留清焕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓祭犯,卻偏偏與公主長得像秸妥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子沃粗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353