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

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

三個條件缺一不可:

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

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

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

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

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

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

5、如何理解STW對系統的影響?調優策略如何制定?------0419

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

15、CMS內存碎片整理會STW嘛?為什么?-------0428

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

16、有幾種情況會觸發老年代執行GC?-------0429

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

17、什么是分配擔保?默認開啟嘛?可以去掉分配擔保機制嗎?為什么需要的是連續空間?-------0430
  • 1、在發生Minor GC之前,虛擬機會檢查老年代最大可用的連續空間是否大于新生代所有對象的總空間
    • 如果大于,則此次Minor GC是安全的。
    • 如果小于,則虛擬機會查看HandlePromotionFailure設置分配擔保。
      • HandlePromotionFailure=true,老年代最大可用連續空間是否大于歷次晉升到老年代的對象的平均大小,如果大于,則嘗試進行一次Minor GC。
      • HandlePromotionFailure=false or 老年代最大可用連續空間小于歷次晉升到老年代的對象的平均大小,執行FullGC。
  • 2、1.6以后是默認開啟的。
  • 3、可以去掉,會加大FullGC發生的概率。虛擬機短暫停止,吞吐量、性能下降。
  • 4、新生代使用的是復制算法,復制算法決定需要連續空間。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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