欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

G1垃圾回收器在并發(fā)場景調(diào)優(yōu)詳解

 更新時間:2022年04月02日 15:12:28   作者:Java知識圖譜  
這篇文章主要為大家介紹了G1垃圾回收器在并發(fā)場景調(diào)優(yōu)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

序言

目前企業(yè)級主流使用的Java版本是8,垃圾回收器支持手動修改為G1,G1垃圾回收器是Java 11的默認設(shè)置,因此G1垃圾回收器可以用很長時間,現(xiàn)階段垃圾回收器優(yōu)化意味著針對G1垃圾回收器優(yōu)化。

為了簡化討論,下面假設(shè)針對4C/16G物理機器進行優(yōu)化。

G1概覽

1、最大堆大小

G1管理的最大堆大小為64G。每個Region的大小通過-XX:G1HeapRegionSize來設(shè)置,大小為1~32MB,默認最多可以有2048個Region,G1能管理的最大堆內(nèi)存是32MB*2048=64G。

使用G1垃圾回收器最小堆內(nèi)存應為1MB*2048=2GB,低于此值建議使用其它垃圾回收器。

2、Region大小

Region大小為1~32MB,具體取值有1MB、2MB、4MB、8MB、16MB、32MB,Region大小優(yōu)化與大對象有關(guān),當對象占用內(nèi)存超過Region的一半時將被視為大對象。

被標記為大對象將不利于垃圾回收。

3、獲取默認值

查看本地JVM特別是G1垃圾回收器當前的默認值。

java -XX:+PrintFlagsInitial  >> ~/1.txt

三種GC模式

G1垃圾回收器有兩種垃圾回收模式,新生代回收和混合回收,特殊情況下會切換到Full GC

1、新生代回收

新生代回收在最大停頓時間內(nèi),會處理所有Eden區(qū)的垃圾。具體操作是將Eden區(qū)所有存活的對象復制到Survivor區(qū),同時清空Eden區(qū)。

新生代回收伴隨著應用暫停,最長停頓時間不超過最大停頓時間,新生代回收盡管有暫停機制,考慮到并行回收的特性,回收邏輯相對簡單,回收效率依然較高。一般而言,新生代回收實際耗時通常低于最大停頓時間。

新生代回收觸發(fā)時機是新創(chuàng)建的對象在Eden區(qū)找不到足夠的存儲空間。

2、混合回收

混合回收伴隨著新生代回收和老年代回收,在最大停頓時間范圍內(nèi),會處理大部分Eden區(qū)的垃圾和一部分老年代垃圾。

老年代回收毫無疑問會伴隨著應用暫停?;旌匣厥詹僮鞅容^復雜,相對新生代回收來說,單位時間回收的垃圾數(shù)要少,回收效率要低。一般而言,混合回收的實際耗時通常接近或者等于最大停頓時間。

混合回收觸發(fā)時機是由參數(shù)InitiatingHeapOccupancyPercent控制,默認值為45,含義是老年代占用空間大小與堆的總大小比值超過此數(shù)便會觸發(fā)混合回收。

默認值45%是比較合理的,不建議所謂的調(diào)優(yōu)。老年代回收策略同樣是將選定Region區(qū)內(nèi)存活的對象復制到空閑Region區(qū),混合回收伴隨著回收新生代垃圾能夠清理出更大的空閑Region區(qū)來存放老年區(qū)存活對象,保證回收過程能夠正常進行。

老年區(qū)存活對象一般較多,對象在內(nèi)存中復制耗時較長,因此相對來說混合回收效率較低。

3、Full GC

Full GC是所有G1垃圾回收調(diào)優(yōu)者盡力回避的情況,單線程回收垃圾,回收對象是整個堆,不再受最長停頓時間約束,一旦出現(xiàn)此情況,意味著應用的響應時間無情的變長。

當應用不定期進入Full GC狀態(tài)時,與其任由其單線程重塑堆內(nèi)存,不如采用冗余策略,在流量低谷時刻,逐一重啟應用,主動重塑堆內(nèi)存空間。

流量高峰期出現(xiàn)Full GC現(xiàn)象及其應對策略后面再討論。

默認參數(shù)

1、堆內(nèi)存

參數(shù)默認值說明優(yōu)化建議
MaxGCPauseMillis200ms最大停頓時間 
G1HeapRegionSize 不設(shè)置時啟發(fā)式推斷 
G1NewSizePercent5新生代最小百分比 
G1MaxNewSizePercent60新生代最大百分比 

2、新生代內(nèi)存回收

參數(shù)默認值說明優(yōu)化建議
ParallelGCThreads 并行GC線程數(shù),會根據(jù)CPU核數(shù)推斷默認值
MaxTenuringThreshold15從新生代晉升到老年代年齡閾值 
SurvivorRatio8Eden和一個Survivor的比例 
TargetSurvivorRatio50Survivor區(qū)內(nèi)存使用率,增大該值會降低到老年代概率 
+G1EagerReclaimHumongousObjectstrue是否在YGC時回收大對象 

3、混合回收

參數(shù)默認值說明優(yōu)化建議
G1MixedGCCountTarget8值越大,收集老年代分區(qū)越少 
G1OldCSetRegionThresholdPercent10表示一次最多收集10%的分區(qū) 

垃圾在堆中流轉(zhuǎn)

垃圾回收器調(diào)優(yōu)的關(guān)鍵是盡可能減少Mixed GC的頻率,換句話說盡可能減少垃圾流轉(zhuǎn)到老年代。GC調(diào)優(yōu)便是認識垃圾在堆中的流轉(zhuǎn)規(guī)律,從而對流向老年代的垃圾予以提前干涉,使之盡可能留在新生代。

垃圾在新生代(主要指Eden區(qū))中,垃圾回收使用YGC,回收線程與應用線程并發(fā)進行,垃圾回收對應用透明進行,假如CPU算力充足的話,應用幾乎感覺不到垃圾在回收進行。

垃圾在老年代中,垃圾回收采用Mixed GC,回收線程開始工作時,應用線程阻塞,等待回收線程工作完畢有,應用線程重新被喚醒。頻繁的Mixed GC對應用的吞吐量產(chǎn)生不良影響。

1、對象如何進入老年代

一般而言,新創(chuàng)建的對象會存在于新生代的Eden區(qū),下一次垃圾回收處罰便直接回收了。如果對象比較頑強(繼續(xù)被其它對象引用),那么會在Survivor區(qū)流轉(zhuǎn),每GC一次,仍然不能被垃圾回收,那么年齡加一,繼續(xù)在S0和S1區(qū)流轉(zhuǎn),當年齡增長到一定的閾值,直接進入老年代。

(1)大對象直接到老年代

新創(chuàng)建的對象如果過大,那么不經(jīng)過新生代,直接進入老年代。控制對象大小閾值有參數(shù)-XX:PretenureSizeThreshold決定,單位字節(jié)。

(2)動態(tài)年齡判斷

除了對象在S0和S1區(qū)反復流轉(zhuǎn)年齡變化外,垃圾回收維護另外一套獨立的年齡判定規(guī)則:如果YGC后尚未被回收的垃圾超過了Survivor區(qū)的50%,那么超過的這批對象會直接進入老年代。

12G * 60% * 10% * 50% * 1024 = 737MB

動態(tài)年齡判定規(guī)則要求每次YGC盡可能的徹底,意味著每次GC的最長時間不能太短,默認200毫秒是比較合理的值。

如果預設(shè)置的最長停頓時間過短,那么每次GC后存活大量尚未被回收的垃圾,S區(qū)容量有限,不該進入老年代的垃圾快速在老年代堆積,頻繁的Mixed GC不可避免。

2、高并發(fā)加速進入老年代

在高并發(fā)場景下,CPU和內(nèi)存資源吃緊,負載很高,不確定的性能抖動加速垃圾進入老年代。

舉例說明,DAO層查詢數(shù)據(jù)庫,一次完整的會話結(jié)束后,整個會話中產(chǎn)生的對象垃圾在Eden區(qū)應當被全部回收。由于網(wǎng)絡(luò)波動,數(shù)據(jù)庫處理能力的限制,大量會話超時。在此過程中這部分對象垃圾很可能在快速S0和S1流轉(zhuǎn)中疊加年齡,或者觸發(fā)動態(tài)年齡判定,直接進入老年代。

老年代內(nèi)存空間不夠用,觸發(fā)Mixed GC,Mixed GC直接副作用是應用卡頓。

調(diào)優(yōu)步驟

1、設(shè)置垃圾回收器

Java 8需要手動指定G1垃圾回收器,命令行添加-XX:+UseG1GC參數(shù)。

2、設(shè)置堆大小

設(shè)置內(nèi)存堆大小有兩點需要注意:初始堆大小與最大堆大小保持一致;堆大小占物理內(nèi)存大小75%~80%,給系統(tǒng)核心服務(wù)預留必要的內(nèi)存。

參數(shù)-Xmx12G設(shè)置初始堆大??;參數(shù)-Xms12G設(shè)置最大堆大小。

3、元空間設(shè)置

元空間是指存儲靜態(tài)類、靜態(tài)方法、常量等特殊變量的內(nèi)存區(qū)域。

參數(shù)-XX:MetaspaceSize=1G設(shè)置元空間初始大??;參數(shù)-XX:MaxMetaspaceSize=1G設(shè)置元空間最大大小。

4、GC停頓時間

GC停頓時間是指每次YGC或者Mixed GC的最大時間,垃圾回收器會根據(jù)用戶設(shè)置的期望時間動態(tài)選擇垃圾掃描的范圍,如果設(shè)置時間過小,可能總有一部分垃圾不能得到回收。單位毫秒。

-XX:MaxGCPauseMillis=200

5、新生代大小

參數(shù)-XX:G1NewSizePercent設(shè)置新生代初始大小,默認為5%;參數(shù)-XX:G1MaxNewSizePercent設(shè)置新生代最大大小,默認為60%。

新生代內(nèi)部細化為 Eden區(qū)和兩個 Survivor ,默認比例是: 8:1:1

Eden:   12G * 60%* 80% = 5.76G
S0:     12G * 60%* 10% = 0.72G
S1:     12G * 60%* 10% = 0.72G

假設(shè)并發(fā)系統(tǒng)每秒創(chuàng)建500MB的對象,假設(shè)每次YGC根據(jù)預先設(shè)置的最長停頓時間都能夠掃描到Eden Region,那么此并發(fā)系統(tǒng)大約每隔10秒需要進行一次YGC。

調(diào)優(yōu)實踐

GC垃圾回收調(diào)優(yōu)是在物理硬件受限制,并且有調(diào)優(yōu)的理論空間下進行的。條件允許的話,直接升級硬件配置特別是物理內(nèi)存配置,能夠有效降低GC頻率。比如8C32G或者16C64G等。

1、頻繁的YGC

當并發(fā)量較大時,頻繁的YGC時必然的,單位時間類創(chuàng)建了更多的對象,使用完畢之后成為了垃圾。頻繁的YGC有加速S區(qū)對象流向老年代的可能,盡可能保證每次YGC的實際耗時低于預設(shè)置的最長垃圾回收時間(默認200毫秒),以便能夠每次都能將新生代垃圾清理完成,盡可能延緩垃圾流向老年代。

2、頻繁的Mixed GC

在G1垃圾回收器中,沒有所謂的Mixed GC的概念,Mixed GC類似于F·GC,不同的是Mixed GC除了回收老年代,同時也回收新生代,共同之處在于都會產(chǎn)生STW

頻繁的Mixed GC本質(zhì)是大量應該在新生代回收的垃圾進入了老年代,解決思路是排查哪些哪些垃圾(對象)應該留在新生代,卻流轉(zhuǎn)到老年代。

(1)大對象

檢查應用程序是否周期性的創(chuàng)建大對象,大對象的閾值由參數(shù)-XX:PretenureSizeThreshold控制。假如內(nèi)存有優(yōu)化空間的前提下適當調(diào)高此值,不得超過S區(qū)的一半(似乎沒有這么大的對象),副作用是新生代存放對象數(shù)量相應變少,Eden區(qū)內(nèi)存更快的用完,YGC相應的變頻繁一些。

從業(yè)務(wù)的角度來講,大對象產(chǎn)生必有其產(chǎn)生的原因,從這個角度優(yōu)化可能性不高,垃圾回收器優(yōu)化盡可能屏蔽業(yè)務(wù)層代碼,畢竟對開發(fā)提要求讓其不要創(chuàng)建大對象不現(xiàn)實。

(2)元空間

元空間耗盡也會引發(fā)Mixed GC,考慮到元空間存儲內(nèi)容的特殊性,因元空間耗盡導致GC頻率提高并沒有很好的辦法。單純提高元空間大小會壓縮新生代大小,新生代變小,對象流轉(zhuǎn)到老年代的數(shù)量會變多,老年代內(nèi)存消耗加快,同樣會提高GC的頻率。

因元空間耗盡引發(fā)的Mixed GC,相對來說增加物理內(nèi)存是比較優(yōu)的解決方式。

3、Full GC

盡管Mixed GC被觸發(fā)時,應用會暫時停止響應(默認值是200毫秒),暫停的時間是相對可控的。

如果在進行Mixed GC時,空閑的Region無法保存存活的對象,Mixed GC無法正常進行時,垃圾回收會切換到 G1 之外的 Serial Old GC 來收集整個堆,包括新生代、老年代、元空間等。

進入Serial Old GC垃圾回收狀態(tài),垃圾回收不再受最長回收時間約束,采用單線程進行標記、清理和壓縮整理,應用可能進入假死狀態(tài)。也許重啟應用,重新分配堆內(nèi)存,將堆內(nèi)存徹底洗牌,也許會更好。

G1垃圾回收調(diào)優(yōu)的關(guān)鍵是不要出現(xiàn)Full GC,因此對于敏感的參數(shù)千萬不要亂調(diào)優(yōu),否則不僅達不到理想想過,反而更糟糕。

以上就是G1垃圾回收器在并發(fā)場景調(diào)優(yōu)詳解的詳細內(nèi)容,更多關(guān)于G1垃圾回收器并發(fā)調(diào)優(yōu)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot3.1.2 引入Swagger報錯Type javax.servlet.http.HttpServletRequest not present解決辦法

    SpringBoot3.1.2 引入Swagger報錯Type javax.servlet.http

    這篇文章主要介紹了SpringBoot3.1.2 引入Swagger報錯Type javax.servlet.http.HttpServletRequest not present解決辦法,文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • idea 創(chuàng)建 maven web 工程流程(圖文教程)

    idea 創(chuàng)建 maven web 工程流程(圖文教程)

    這篇文章主要介紹了idea 創(chuàng)建 maven web 工程流程(圖文教程),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • SpringBoot 關(guān)于Feign的超時時間配置操作

    SpringBoot 關(guān)于Feign的超時時間配置操作

    這篇文章主要介紹了SpringBoot 關(guān)于Feign的超時時間配置操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot使用@Autowired為多實現(xiàn)的接口注入依賴

    SpringBoot使用@Autowired為多實現(xiàn)的接口注入依賴

    這篇文章主要介紹了SpringBoot使用@Autowired為多實現(xiàn)的接口注入依賴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 基于Java利用static實現(xiàn)單例模式

    基于Java利用static實現(xiàn)單例模式

    這篇文章主要介紹了基于Java利用static實現(xiàn)單例模式,當在多個線程同時觸發(fā)類的初始化過程的時候static不會被多次執(zhí)行,下面我們一起進入文章看看具體要的原因
    2022-01-01
  • 全鏈路監(jiān)控平臺Pinpoint?SkyWalking?Zipkin選型對比

    全鏈路監(jiān)控平臺Pinpoint?SkyWalking?Zipkin選型對比

    這篇文章主要為大家介紹了全鏈路監(jiān)控平臺Pinpoint?SkyWalking?Zipkin實現(xiàn)的選型對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Javaweb使用thymeleaf局部刷新結(jié)合Layui插件實現(xiàn)Html分頁

    Javaweb使用thymeleaf局部刷新結(jié)合Layui插件實現(xiàn)Html分頁

    本文主要介紹了Javaweb使用thymeleaf局部刷新結(jié)合Layui插件實現(xiàn)Html分頁,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • java實現(xiàn)簡單的拼圖游戲

    java實現(xiàn)簡單的拼圖游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單的拼圖游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 你還在用Synchronized?Atomic你了解不?

    你還在用Synchronized?Atomic你了解不?

    這篇文章主要介紹了你還在用Synchronized?Atomic你了解不? 文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • Spring配置文件使用占位符配置方式

    Spring配置文件使用占位符配置方式

    這篇文章主要介紹了Spring配置文件使用占位符配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論