22-大廠面試題:Con-current Mode Failure如何導致以及解決

上文我們已經(jīng)介紹了CMS垃圾收集器的工作原理以及流程茸俭,本篇我們接著深入說明CMS垃圾收集器的缺點以及所導致的一些問題應該如何解決的猛。先通過一張完整的圖來回顧CMS工作的邏輯:
image
CMS的缺點分析

CMS是一款優(yōu)秀的收集器, 它最主要的優(yōu)點在名字上已經(jīng)體現(xiàn)出來:并發(fā)收集熏迹、 低停頓檐薯, 一些官方公開文檔里面也稱之為“并發(fā)低停頓收集器”(Concurrent Low Pause Collector) 。CMS收集器是HotSpot虛擬機追求低停頓的第一次成功嘗試注暗, 但是它還遠達不到完美的程度, 至少有以下三個明顯的缺點:

1.并發(fā)導致CPU資源緊張

首先墓猎, CMS收集器對處理器資源非常敏感捆昏。事實上, 面向并發(fā)設計的程序都對處理器資源比較敏感毙沾。在并發(fā)階段骗卜, 它雖然不會導致用戶線程停頓, 但卻會因為占用了一部分線程(或者說處理器的計算能力) 而導致應用程序變慢, 降低總吞吐量寇仓。

CMS默認啟動的回收線程數(shù)是(處理器核心數(shù)量+3) /4举户, 也就是說, 如果處理器核心數(shù)在四個或以上遍烦, 并發(fā)回收時垃圾收集線程只占用不超過25%的處理器運算資源俭嘁, 并且會隨著處理器核心數(shù)量的增加而下降。但是當處理器核心數(shù)量不足四個時服猪,CMS對用戶程序的影響就可能變得很大供填。如果應用本來的處理器負載就很高, 還要分出一半的運算能力去執(zhí)行收集器線程罢猪, 就可能導致用戶程序的執(zhí)行速度忽然大幅降低近她。

比如我們常見的機器是2核4G,那么分配給CMS的回收線程數(shù)= (2+3)/4 =1 個膳帕,直接占據(jù)了一半的CPU資源

因此CMS帶來的第一個問題就是影響CPU的資源使用粘捎,特別是在本身CPU核數(shù)就少的情況下。

2.Con-current Mode Failure問題

由于CMS收集器無法處理“浮動垃圾”(Floating Garbage) 危彩, 有可能出現(xiàn)“Con-current Mode Failure”失敗進而導致另一次完全“Stop The World”的Full GC的產(chǎn)生攒磨。

在CMS的并發(fā)標記和并發(fā)清理階段, 用戶線程是還在繼續(xù)運行的恬砂, 程序在運行自然就還會伴隨有新的垃圾對象不斷產(chǎn)生咧纠, 但這一部分垃圾對象是出現(xiàn)在標記過程結(jié)束以后, CMS無法在當次收集中處理掉它們泻骤, 只好留待下一次垃圾收集時再清理掉漆羔。這一部分垃圾就稱為“浮動垃圾”。

由于在垃圾收集階段用戶線程還需要持續(xù)運行狱掂, 那就還需要預留足夠內(nèi)存空間提供給用戶線程使用演痒, 因此CMS收集器不能像其他收集器那樣等待到老年代幾乎完全被填滿了再進行收集, 必須預留一部分空間供并發(fā)收集時的程序運作使用趋惨。

在JDK5的默認設置下鸟顺, CMS收集器當老年代使用了68%的空間后就會被激活, 這是一個偏保守的設置器虾, 如果在實際應用中老年代增長并不是太快讯嫂, 可以適當調(diào)高參數(shù)-XX:CMSInitiatingOccu-pancyFraction的值來提高CMS的觸發(fā)百分比, 降低內(nèi)存回收頻率兆沙, 獲取更好的性能欧芽。到了JDK 6時, CMS收集器的啟動閾值就已經(jīng)默認提升至92%葛圃。

但這又會更容易面臨另一種風險:要是CMS運行期間預留的內(nèi)存無法滿足程序分配新對象的需要千扔, 就會出現(xiàn)一次“并發(fā)失敗”(Concurrent Mode Failure) 憎妙, 這時候虛擬機將不得不啟動后備預案:凍結(jié)用戶線程的執(zhí)行, 臨時啟用Serial Old收集器來重新進行老年代的垃圾收集曲楚,但這樣停頓時間就很長了厘唾。所以參數(shù)-XX:CMSInitiatingOccupancyFraction設置得太高將會很容易導致大量的并發(fā)失敗產(chǎn)生, 性能反而降低龙誊, 用戶應在生產(chǎn)環(huán)境中根據(jù)實際應用情況來權(quán)衡設置抚垃。

3.內(nèi)存碎片問題

最后一個缺點, 在本節(jié)的開頭曾提到载迄, CMS是一款基于“標記-清除”算法實現(xiàn)的收集器讯柔, 如果讀者對前面這部分介紹還有印象的話, 就可能想到這意味著收集結(jié)束時會有大量空間碎片產(chǎn)生护昧。(如下紅圈所示)

image

空間碎片過多時魂迄, 將會給大對象分配帶來很大麻煩, 往往會出現(xiàn)老年代還有很多剩余空間惋耙, 但就是無法找到足夠大的連續(xù)空間來分配當前對象捣炬, 而不得不提前觸發(fā)一次Full GC的情況。

為了解決這個問題绽榛,CMS收集器提供了一個-XX:+UseCMS-CompactAtFullCollection開關(guān)參數(shù)(默認是開啟的湿酸, 此參數(shù)從JDK 9開始廢棄) , 用于在CMS收集器不得不進行Full GC時開啟內(nèi)存碎片的合并整理過程灭美, 由于這個 內(nèi)存整理必須移動存活對象推溃, (在Shenandoah和ZGC出現(xiàn)前) 是無法并發(fā)的。這樣空間碎片問題是解 決了届腐, 但停頓時間又會變長铁坎, 因此虛擬機設計者們還提供了另外一個參數(shù)-XX:CMSFullGCsBeforeCompaction(此參數(shù)從JDK 9開始廢棄) , 這個參數(shù)的作用是要求CMS收集器在執(zhí)行過若干次(數(shù)量由參數(shù)值決定) 不整理空間的Full GC之后犁苏, 下一次進入Full GC前會先進行碎片整理(默認值為0硬萍, 表 示每次進入Full GC時都進行碎片整理) 。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末围详,一起剝皮案震驚了整個濱河市朴乖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌助赞,老刑警劉巖买羞,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雹食,居然都是意外死亡哩都,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門婉徘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漠嵌,“玉大人,你說我怎么就攤上這事盖呼∪迓梗” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵几晤,是天一觀的道長约炎。 經(jīng)常有香客問我,道長蟹瘾,這世上最難降的妖魔是什么圾浅? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮憾朴,結(jié)果婚禮上狸捕,老公的妹妹穿的比我還像新娘。我一直安慰自己众雷,他們只是感情好灸拍,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砾省,像睡著了一般鸡岗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上编兄,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天轩性,我揣著相機與錄音,去河邊找鬼狠鸳。 笑死揣苏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的碰煌。 我是一名探鬼主播舒岸,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芦圾!你這毒婦竟也來了蛾派?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤个少,失蹤者是張志新(化名)和其女友劉穎洪乍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夜焦,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡壳澳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了茫经。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巷波。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡萎津,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抹镊,到底是詐尸還是另有隱情锉屈,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布垮耳,位于F島的核電站颈渊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏终佛。R本人自食惡果不足惜俊嗽,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铃彰。 院中可真熱鬧绍豁,春花似錦、人聲如沸豌研。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹃共。三九已至鬼佣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霜浴,已是汗流浹背晶衷。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阴孟,地道東北人晌纫。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像永丝,于是被迫代替她去往敵國和親锹漱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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