面试官 100% 会严刑拷打的 CMS 垃圾回收器,下次面试就拿这篇文章怼回去!
??點(diǎn)擊上方?好好學(xué)java?,選擇?星標(biāo)?公眾號(hào)
重磅資訊、干貨,第一時(shí)間送達(dá) 今日推薦:牛人 20000 字的 Spring Cloud 總結(jié),太硬核了~這里跟大家講個(gè)面試的最常見的垃圾回收器的問題,我跟大伙說,你不用懷疑,CMS垃圾回收器一定是最常見的問題,只要問到了Java虛擬機(jī),面試官恨不得就問你CMS,當(dāng)然還有就是G1這個(gè)垃圾回收器了,所以,關(guān)于這個(gè)垃圾回收器的細(xì)節(jié)問題,一定要掌握好,只要掌握到位,那么一定可以讓面試官滿意。
但是,說句糟心的話,運(yùn)氣不好,面試官就是不對(duì)眼,也是沒有辦法的事情,只能認(rèn)栽,自我感覺再良好,也只是自我感覺,在面試官心里,你就是渣渣!!!
好了,下面我們開始面試環(huán)節(jié),這篇文章想換一種方式,我們列舉一些面試常見的問題,然后再來回答這些問題。
正文
這個(gè)春天,因?yàn)橐咔榈脑?#xff0c;所有的面試都是線上遠(yuǎn)程面試的,所以,如果運(yùn)氣好,你可以看到面試官的臉,如果運(yùn)氣不好,你可以只能被面試官看到你緊張的樣子,而你,看到的只是黑屏,哈哈!
這就是最真實(shí)的場景!
可是,并沒有面試官的身影,只有一次又一次的毒打!!
小伙子,你說一下 CMS 垃圾回收器吧!
這個(gè)題目一來,嚇出一身冷汗,差點(diǎn)就沒有復(fù)習(xí)這個(gè)CMS,還好昨晚抱佛腳看了一下哈。
于是我。。。一頓操作猛如虎。
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器,它是基于“標(biāo)記-清除”算法實(shí)現(xiàn)的,并且常見的應(yīng)用場景是互聯(lián)網(wǎng)站或者B/S系統(tǒng)的服務(wù)端上的Java應(yīng)用。
結(jié)果就一緊張就記得這么多,面試官肯定不滿意了,這個(gè)時(shí)候,面試官的常規(guī)操作是,繼續(xù)嚴(yán)刑拷打,他想,你可能忘記了,我來提醒提醒你!
CMS收集器工作的整個(gè)流程是怎么樣的,你能給我講講嗎?
這個(gè)時(shí)候,面試官還會(huì)安慰你說不用緊張,但是,安慰歸安慰,最后掛不掛可是另一回事。
于是,我又開始回答問題。
CMS 處理過程有七個(gè)步驟:
初始標(biāo)記,會(huì)導(dǎo)致stw;
并發(fā)標(biāo)記,與用戶線程同時(shí)運(yùn)行;
預(yù)清理,與用戶線程同時(shí)運(yùn)行;
可被終止的預(yù)清理,與用戶線程同時(shí)運(yùn)行;
重新標(biāo)記 ,會(huì)導(dǎo)致swt;
并發(fā)清除,與用戶線程同時(shí)運(yùn)行;
其實(shí),只要回答四個(gè)就差不多了,是這幾個(gè)。
初始標(biāo)記:僅僅只是標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對(duì)象,速度很快,需要“Stop The World”。
并發(fā)標(biāo)記:進(jìn)行GC Roots Tracing的過程,在整個(gè)過程中耗時(shí)最長。
重新標(biāo)記:為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄,這個(gè)階段的停頓時(shí)間一般會(huì)比初始標(biāo)記階段稍長一些,但遠(yuǎn)比并發(fā)標(biāo)記的時(shí)間短。此階段也需要“Stop The World”。
并發(fā)清除。
你以為這樣子就可以了,面試官就會(huì)說可以了,如果可以了,那估計(jì)你涼了!
面試官說:CMS這么好,那有沒有什么缺點(diǎn)呢?
我。。。好吧,誰怪我這么強(qiáng)呢,對(duì)吧。
其實(shí),CMS雖然經(jīng)過這么些年的考驗(yàn),已經(jīng)是一個(gè)值得信賴的GC回收器了,但是,其實(shí)也是有一些他的不足的,
第一,垃圾碎片的問題,我們都知道CMS是使用的是標(biāo)記-清除算法的,所以不可避免的就是會(huì)出現(xiàn)垃圾碎片的問題。第二,一般CMS的GC耗時(shí)80%都在remark階段,remark階段停頓時(shí)間會(huì)很長,在CMS的這四個(gè)主要的階段中,最費(fèi)時(shí)間的就是重新標(biāo)記階段。第三,concurrent mode failure,說出這個(gè)的時(shí)候,面試官就會(huì)覺得,小伙子,哎呦,不錯(cuò)喲,掌握的比較清楚,那這個(gè)是什么意思呢,其實(shí)是說:
這個(gè)異常發(fā)生在cms正在回收的時(shí)候。執(zhí)行CMS GC的過程中,同時(shí)業(yè)務(wù)線程也在運(yùn)行,當(dāng)年輕帶空間滿了,執(zhí)行ygc時(shí),需要將存活的對(duì)象放入到老年代,而此時(shí)老年代空間不足,這時(shí)CMS還沒有機(jī)會(huì)回收老年帶產(chǎn)生的,或者在做Minor GC的時(shí)候,新生代救助空間放不下,需要放入老年代,而老年代也放不下而產(chǎn)生的。
第四,promotion failed,這個(gè)問題是指,在進(jìn)行Minor GC時(shí),Survivor空間不足,對(duì)象只能放入老年代,而此時(shí)老年代也放不下造成的,多數(shù)是由于老年代有足夠的空閑空間,但是由于碎片較多,新生代要轉(zhuǎn)移到老年帶的對(duì)象比較大,找不到一段連續(xù)區(qū)域存放這個(gè)對(duì)象導(dǎo)致的。
面試官看到你掌握的這么好,心里已經(jīng)給你豎起來大拇指,但是,面試官覺得你優(yōu)秀啊,就還想看看你到底還有多少東西。
既然你知道有這么多的缺點(diǎn),那么你知道怎么解決這些問題嗎?
這個(gè)真的被問蒙了,你以為我什么都會(huì)嗎!!!!
但是,我還是得給大家講講,不然下次被問到,可能會(huì)把鍋甩給我。
垃圾碎片的問題:針對(duì)這個(gè)問題,這時(shí)候我們需要用到這個(gè)參數(shù):-XX:CMSFullGCsBeforeCompaction=n 意思是說在上一次CMS并發(fā)GC執(zhí)行過后,到底還要再執(zhí)行多少次full GC才會(huì)做壓縮。默認(rèn)是0,也就是在默認(rèn)配置下每次CMS GC頂不住了而要轉(zhuǎn)入full GC的時(shí)候都會(huì)做壓縮。
concurrent mode failure
解決這個(gè)問題其實(shí)很簡單,只需要設(shè)置兩個(gè)參數(shù)即可
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60:是指設(shè)定CMS在對(duì)內(nèi)存占用率達(dá)到60%的時(shí)候開始GC。
為什么設(shè)置這兩個(gè)參數(shù)呢?由于在垃圾收集階段用戶線程還需要運(yùn)行,那也就還需要預(yù)留有足夠的內(nèi)存空間給用戶線程使用,因此CMS收集器不能像其他收集器那樣等到老年代幾乎完全被填滿了再進(jìn)行收集。
當(dāng)然也不能設(shè)置過高,比如90%,這時(shí)候雖然GC次數(shù)少,但是,卻會(huì)導(dǎo)致用于用戶線程空間小,效率不高,太低10%,你自己想想會(huì)怎么樣,體會(huì)體會(huì)!
哈哈,萬事大吉,這一點(diǎn)說出了,估計(jì)面試官已經(jīng)愛上我了吧,趕緊把我招進(jìn)去干活吧。。。
remark階段停頓時(shí)間會(huì)很長的問題:解決這個(gè)問題巨簡單,加入-XX:+CMSScavengeBeforeRemark。在執(zhí)行remark操作之前先做一次Young GC,目的在于減少年輕代對(duì)老年代的無效引用,降低remark時(shí)的開銷。
結(jié)尾
面到這里,面試官給你說了一句:小伙子很優(yōu)秀,思考問題很深入,什么時(shí)候可以來我們公司實(shí)習(xí),我們公司轉(zhuǎn)正幾率很高啊,歡迎您的加入!
這是本人在這幾年及春招的總結(jié),歷時(shí)3個(gè)月,我覺得很全面了,對(duì)于面試很有幫助,目前,本人已經(jīng)拿到了騰訊等大廠offer,進(jìn)入到大廠不是夢想,github 地址:
https://github.com/OUYANGSIHAI/JavaInterview
這么辛苦總結(jié),給個(gè)star好不好。?點(diǎn)擊閱讀原文,直達(dá)
總結(jié)
以上是生活随笔為你收集整理的面试官 100% 会严刑拷打的 CMS 垃圾回收器,下次面试就拿这篇文章怼回去!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【拥抱大厂系列】几个面试官常问的垃圾回收
- 下一篇: 一直用git,你了解git的内部机制吗?