1、JVM何時(shí)會(huì)回收??類?-----0415
三個(gè)條件缺一不可:
- 1枪狂、類的所有實(shí)例(堆中)都已經(jīng)被回收??危喉。
- 2、該類的ClassLoader已經(jīng)被回收??了州疾。
- 3辜限、該類對(duì)應(yīng)的Class對(duì)象沒(méi)有任何引用。
2严蓖、方法執(zhí)行完畢薄嫡,棧幀立馬出棧,該棧幀中的變量數(shù)據(jù)立馬回收??颗胡?還是等垃圾回收器回收??毫深?為什么?-----0416
出棧就回收了毒姨,基礎(chǔ)類型變量?jī)?nèi)存分配就在棧中哑蔫,所以出棧就直接銷毀了。引用堆中的對(duì)象需要等一次YongGC弧呐。
3闸迷、實(shí)例對(duì)象被回收’和‘Class對(duì)象沒(méi)有引用’ 是一個(gè)概念么?-----0417
不是俘枫,Class對(duì)象代表的是類腥沽,如果有變量引用了類的Class對(duì)象,那么就是有引用鸠蚪。
4今阳、新生代為何分為三塊區(qū)域{Eden、From茅信、To}盾舌,半劈分成兩塊為什么不行?-----0418
三塊區(qū)域蘸鲸,只有From or To 空間是閑置的矿筝,而分為兩塊后,要有一半的新生代資源閑置著棚贾。
5、如何理解STW對(duì)系統(tǒng)的影響榆综?調(diào)優(yōu)策略如何制定妙痹?------0419
一直以來(lái)都是想著控制yonggc在50ms以下,oldgc在300ms以下鼻疮。但是GC執(zhí)行勢(shì)必都會(huì)帶來(lái)STW,JVM分代回收??的本質(zhì)是對(duì)象的生命周期結(jié)束時(shí)就近一次執(zhí)行GC進(jìn)行回收。所以調(diào)優(yōu)者需要估算出對(duì)象的生命周期篙议。
6、parnew+cms回收器崭篡,如何保證只做yonggc?-------0420
需要觀察每秒鐘新增多少對(duì)象吧秕,多長(zhǎng)時(shí)間觸發(fā)一次yonggc琉闪,平均一次yonggc后有多少對(duì)象存活,survivor區(qū)域是否放的下(對(duì)象動(dòng)態(tài)年齡等問(wèn)題)砸彬,計(jì)算survivor區(qū)域與eden區(qū)域比例跳過(guò)動(dòng)態(tài)年齡導(dǎo)致進(jìn)入老年代的問(wèn)題颠毙。
7、使用ParNew回收器并行線程是怎么設(shè)置的砂碉?------0421
一般是與應(yīng)用服務(wù)器的CPU核數(shù)保持一致蛀蜜。非要設(shè)定可以使用-XX:ParallelGCThreads指定。
8增蹭、啟動(dòng)系統(tǒng)的時(shí)候是選擇服務(wù)端模式還是客戶端模式滴某?對(duì)ParNew有什么影響?------0422
系統(tǒng)部署在linux上就選擇server模式滋迈,部署在windows上就選擇client模式霎奢。
一般web項(xiàng)目都是部署在多核的linux服務(wù)器上面,ParNew可以充分利用多核資源杀怠。windows上一般都是安裝client模式椰憋,比如qq、wx等赔退,如果用ParNew方式會(huì)導(dǎo)致CPU運(yùn)行多個(gè)線程橙依,反而加重了性能開(kāi)銷。所以Client一般選擇Serial模式硕旗。
9窗骑、CMS回收??第一階段“初始標(biāo)記”都標(biāo)記哪些?STW嘛漆枚?------0423
初始標(biāo)記需要STW创译,為了保障低停頓,只標(biāo)記出GC-ROOT直接引用的對(duì)象墙基。
10软族、CMS回收??第二階段“并發(fā)標(biāo)記”都標(biāo)記哪些?STW嘛残制?------0424
并發(fā)標(biāo)記不會(huì)STW立砸,垃圾回收線程與工作線程同時(shí)工作。并發(fā)標(biāo)記時(shí)根據(jù)第一階段標(biāo)記的GC-ROOT進(jìn)行延展標(biāo)記初茶。
11颗祝、CMS回收??第三階段“重新標(biāo)記”都標(biāo)記哪些?STW嘛?------0425
重新標(biāo)記需要STW螺戳,需要標(biāo)記第二階段新創(chuàng)建對(duì)象&已有對(duì)象可能失去引用變成垃圾搁宾。
12、CMS回收??第四階段“并發(fā)清理”會(huì)STW嘛倔幼?------0425
并發(fā)清理很耗時(shí)盖腿,需要進(jìn)行對(duì)象清理,垃圾回收線程與工作線程并發(fā)運(yùn)行的凤藏,不會(huì)STW奸忽。
13、CMS回收??“并發(fā)標(biāo)記”&“并發(fā)清理”這兩個(gè)階段時(shí)揖庄,垃圾回收線程與工作線程并行運(yùn)行栗菜,會(huì)導(dǎo)致cpu資源會(huì)成為瓶頸,CMS并發(fā)回收線程數(shù)如何設(shè)置蹄梢?-------0426
cms默認(rèn)啟動(dòng)的垃圾回收線程數(shù):(cpu核數(shù)+3)/4
14疙筹、CMS回收器在“并發(fā)清理”階段可能會(huì)發(fā)生“Concurrent Mode Failure”問(wèn)題?為什么禁炒?發(fā)生了“Concurrent Mode Failure”問(wèn)題jvm會(huì)如何解決而咆?-------0427
CMS在“并發(fā)清理”階段系統(tǒng)線程是工作著的,這就會(huì)產(chǎn)生“浮動(dòng)垃圾”(通過(guò)YongGC進(jìn)入老年代的對(duì)象)幕袱,CMS為了保證回收期間還有一定的內(nèi)存空間讓一些對(duì)象進(jìn)入老年代暴备,一半會(huì)預(yù)留一些空間,-XX:CMSInitiatingOccupancyFraction設(shè)置剩余百分比(默認(rèn)68%)们豌。
如果CMS在回收期間涯捻,剩余空間小于本次晉升的對(duì)象大小會(huì)怎樣呢?
就會(huì)發(fā)生“Concurrent Mode Failure”錯(cuò)誤望迎,也就是說(shuō)并發(fā)垃圾回收失敗障癌,此時(shí)JVM會(huì)升級(jí)處理策略:自動(dòng)啟用“Serial Old”垃圾回收??替代CMS回收??,Serial Old 會(huì)強(qiáng)行STW辩尊,重新進(jìn)行GC-Roots跟蹤標(biāo)記出全部垃圾對(duì)象涛浙,不允許新對(duì)象產(chǎn)生,一次性清理垃圾對(duì)象摄欲,然后恢復(fù)系統(tǒng)線程轿亮。
15、CMS內(nèi)存碎片整理會(huì)STW嘛胸墙?為什么我注?-------0428
首先內(nèi)存整理會(huì)STW,內(nèi)存碎片會(huì)導(dǎo)致分配連續(xù)空間受阻劳秋,JVM就會(huì)頻繁觸發(fā)FullGC。所以CMS也會(huì)根據(jù)設(shè)置-XX:CMSFullGCsBeforeCompaction=n意思是說(shuō)在上一次CMS并發(fā)GC執(zhí)行過(guò)后,到底還要再執(zhí)行多少次full GC才會(huì)做壓縮玻淑。默認(rèn)是0嗽冒,也就是在默認(rèn)配置下每次CMS GC頂不住了而要轉(zhuǎn)入full GC的時(shí)候都會(huì)做壓縮。 如果把CMSFullGCsBeforeCompaction配置為10补履,就會(huì)讓上面說(shuō)的第一個(gè)條件變成每隔10次真正的full GC才做一次壓縮添坊。
16、有幾種情況會(huì)觸發(fā)老年代執(zhí)行GC箫锤?-------0429
-1贬蛙、老年代可用空間小于新生代全部對(duì)象的大小,如果沒(méi)有開(kāi)啟空間擔(dān)保策略會(huì)執(zhí)行FullGC谚攒,一般默認(rèn)擔(dān)保策略是打開(kāi)的阳准。
-2、歷次新生代GC后進(jìn)入老年代的平均大小大于老年代可用空間馏臭。
-3野蝇、老年代使用空間大于-XX:CMSInitiatingOccupancyFraction設(shè)置的閥值。
17括儒、什么是分配擔(dān)保绕沈?默認(rèn)開(kāi)啟嘛?可以去掉分配擔(dān)保機(jī)制嗎帮寻?為什么需要的是連續(xù)空間乍狐?-------0430
- 1、在發(fā)生Minor GC之前固逗,虛擬機(jī)會(huì)檢查
老年代最大可用的連續(xù)空間
是否大于新生代所有對(duì)象的總空間
浅蚪。- 如果大于,則此次Minor GC是安全的抒蚜。
- 如果小于掘鄙,則虛擬機(jī)會(huì)查看HandlePromotionFailure設(shè)置分配擔(dān)保。
- HandlePromotionFailure=true嗡髓,老年代最大可用連續(xù)空間是否大于歷次晉升到老年代的對(duì)象的平均大小操漠,如果大于,則嘗試進(jìn)行一次Minor GC饿这。
- HandlePromotionFailure=false or 老年代最大可用連續(xù)空間小于歷次晉升到老年代的對(duì)象的平均大小浊伙,執(zhí)行FullGC。
- 2长捧、1.6以后是默認(rèn)開(kāi)啟的嚣鄙。
- 3、可以去掉串结,會(huì)加大FullGC發(fā)生的概率哑子。虛擬機(jī)短暫停止舅列,吞吐量、性能下降卧蜓。
- 4帐要、新生代使用的是復(fù)制算法,復(fù)制算法決定需要連續(xù)空間弥奸。