jvm 優(yōu)化篇-(6)-問題大匯總,每日一題?

死神---朽木白哉
1、JVM何時會回收??類?-----0415

三個條件缺一不可:

  • 1、類的所有實例(堆中)都已經(jīng)被回收??。
  • 2、該類的ClassLoader已經(jīng)被回收??了。
  • 3、該類對應的Class對象沒有任何引用。
2、方法執(zhí)行完畢,棧幀立馬出棧,該棧幀中的變量數(shù)據(jù)立馬回收???還是等垃圾回收器回收???為什么?-----0416

出棧就回收了,基礎(chǔ)類型變量內(nèi)存分配就在棧中,所以出棧就直接銷毀了。引用堆中的對象需要等一次YongGC。

3、實例對象被回收’和‘Class對象沒有引用’ 是一個概念么?-----0417

不是,Class對象代表的是類,如果有變量引用了類的Class對象,那么就是有引用。

4、新生代為何分為三塊區(qū)域{Eden、From、To},半劈分成兩塊為什么不行?-----0418

三塊區(qū)域,只有From or To 空間是閑置的,而分為兩塊后,要有一半的新生代資源閑置著。

5、如何理解STW對系統(tǒng)的影響?調(diào)優(yōu)策略如何制定?------0419

一直以來都是想著控制yonggc在50ms以下,oldgc在300ms以下。但是GC執(zhí)行勢必都會帶來STW,JVM分代回收??的本質(zhì)是對象的生命周期結(jié)束時就近一次執(zhí)行GC進行回收。所以調(diào)優(yōu)者需要估算出對象的生命周期。

6、parnew+cms回收器,如何保證只做yonggc?-------0420

需要觀察每秒鐘新增多少對象,多長時間觸發(fā)一次yonggc,平均一次yonggc后有多少對象存活,survivor區(qū)域是否放的下(對象動態(tài)年齡等問題),計算survivor區(qū)域與eden區(qū)域比例跳過動態(tài)年齡導致進入老年代的問題。

7、使用ParNew回收器并行線程是怎么設(shè)置的?------0421

一般是與應用服務器的CPU核數(shù)保持一致。非要設(shè)定可以使用-XX:ParallelGCThreads指定。

8、啟動系統(tǒng)的時候是選擇服務端模式還是客戶端模式?對ParNew有什么影響?------0422

系統(tǒng)部署在linux上就選擇server模式,部署在windows上就選擇client模式。
一般web項目都是部署在多核的linux服務器上面,ParNew可以充分利用多核資源。windows上一般都是安裝client模式,比如qq、wx等,如果用ParNew方式會導致CPU運行多個線程,反而加重了性能開銷。所以Client一般選擇Serial模式。

9、CMS回收??第一階段“初始標記”都標記哪些?STW嘛?------0423

初始標記需要STW,為了保障低停頓,只標記出GC-ROOT直接引用的對象。
10、CMS回收??第二階段“并發(fā)標記”都標記哪些?STW嘛?------0424
并發(fā)標記不會STW,垃圾回收線程與工作線程同時工作。并發(fā)標記時根據(jù)第一階段標記的GC-ROOT進行延展標記。

11、CMS回收??第三階段“重新標記”都標記哪些?STW嘛?------0425

重新標記需要STW,需要標記第二階段新創(chuàng)建對象&已有對象可能失去引用變成垃圾。

12、CMS回收??第四階段“并發(fā)清理”會STW嘛?------0425

并發(fā)清理很耗時,需要進行對象清理,垃圾回收線程與工作線程并發(fā)運行的,不會STW。

13、CMS回收??“并發(fā)標記”&“并發(fā)清理”這兩個階段時,垃圾回收線程與工作線程并行運行,會導致cpu資源會成為瓶頸,CMS并發(fā)回收線程數(shù)如何設(shè)置?-------0426

cms默認啟動的垃圾回收線程數(shù):(cpu核數(shù)+3)/4

14、CMS回收器在“并發(fā)清理”階段可能會發(fā)生“Concurrent Mode Failure”問題?為什么?發(fā)生了“Concurrent Mode Failure”問題jvm會如何解決?-------0427

CMS在“并發(fā)清理”階段系統(tǒng)線程是工作著的,這就會產(chǎn)生“浮動垃圾”(通過YongGC進入老年代的對象),CMS為了保證回收期間還有一定的內(nèi)存空間讓一些對象進入老年代,一半會預留一些空間,-XX:CMSInitiatingOccupancyFraction設(shè)置剩余百分比(默認68%)。
如果CMS在回收期間,剩余空間小于本次晉升的對象大小會怎樣呢?
就會發(fā)生“Concurrent Mode Failure”錯誤,也就是說并發(fā)垃圾回收失敗,此時JVM會升級處理策略:自動啟用“Serial Old”垃圾回收??替代CMS回收??,Serial Old 會強行STW,重新進行GC-Roots跟蹤標記出全部垃圾對象,不允許新對象產(chǎn)生,一次性清理垃圾對象,然后恢復系統(tǒng)線程。

15、CMS內(nèi)存碎片整理會STW嘛?為什么?-------0428

首先內(nèi)存整理會STW,內(nèi)存碎片會導致分配連續(xù)空間受阻,JVM就會頻繁觸發(fā)FullGC。所以CMS也會根據(jù)設(shè)置-XX:CMSFullGCsBeforeCompaction=n意思是說在上一次CMS并發(fā)GC執(zhí)行過后,到底還要再執(zhí)行多少次full GC才會做壓縮。默認是0,也就是在默認配置下每次CMS GC頂不住了而要轉(zhuǎn)入full GC的時候都會做壓縮。 如果把CMSFullGCsBeforeCompaction配置為10,就會讓上面說的第一個條件變成每隔10次真正的full GC才做一次壓縮。

16、有幾種情況會觸發(fā)老年代執(zhí)行GC?-------0429

-1、老年代可用空間小于新生代全部對象的大小,如果沒有開啟空間擔保策略會執(zhí)行FullGC,一般默認擔保策略是打開的。
-2、歷次新生代GC后進入老年代的平均大小大于老年代可用空間。
-3、老年代使用空間大于-XX:CMSInitiatingOccupancyFraction設(shè)置的閥值。

17、什么是分配擔保?默認開啟嘛?可以去掉分配擔保機制嗎?為什么需要的是連續(xù)空間?-------0430
  • 1、在發(fā)生Minor GC之前,虛擬機會檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象的總空間
    • 如果大于,則此次Minor GC是安全的。
    • 如果小于,則虛擬機會查看HandlePromotionFailure設(shè)置分配擔保。
      • HandlePromotionFailure=true,老年代最大可用連續(xù)空間是否大于歷次晉升到老年代的對象的平均大小,如果大于,則嘗試進行一次Minor GC。
      • HandlePromotionFailure=false or 老年代最大可用連續(xù)空間小于歷次晉升到老年代的對象的平均大小,執(zhí)行FullGC。
  • 2、1.6以后是默認開啟的。
  • 3、可以去掉,會加大FullGC發(fā)生的概率。虛擬機短暫停止,吞吐量、性能下降。
  • 4、新生代使用的是復制算法,復制算法決定需要連續(xù)空間。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 工作之余,想總結(jié)一下JVM相關(guān)知識。 Java運行時數(shù)據(jù)區(qū): Java虛擬機在執(zhí)行Java程序的過程中會將其管理的...
    Huang遠閱讀 687評論 0 2
  • 第二部分 自動內(nèi)存管理機制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運行數(shù)據(jù)區(qū)域 程序計數(shù)器:當前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,300評論 0 2
  • JVM面試題 來都來了,點個贊唄 文末領(lǐng)取博主為大家準備的面試渡劫大禮包喔 1、內(nèi)存模型以及分區(qū),需要詳細到每個區(qū)...
    Python學習君閱讀 944評論 0 7
  • 十二月的天氣略微有些冷,南方的天氣總揮灑著細密的雨滴,如若真是南方,也是好的,不偏不倚的江南,給人一種怎樣的遐思,...
    長路M閱讀 426評論 1 2
  • 24 今天中午不知道怎么了,睡醒了之后整頭是汗,賊難受了,就連今天下午跑步也沒這么濕。 今天體檢了,比之前重了...
    YTiua閱讀 159評論 0 0

友情鏈接更多精彩內(nèi)容