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

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

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

序言

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

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

G1概覽

1、最大堆大小

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

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

2、Region大小

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

被標(biāo)記為大對(duì)象將不利于垃圾回收。

3、獲取默認(rèn)值

查看本地JVM特別是G1垃圾回收器當(dāng)前的默認(rèn)值。

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

三種GC模式

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

1、新生代回收

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

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

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

2、混合回收

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

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

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

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

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

3、Full GC

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

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

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

默認(rèn)參數(shù)

1、堆內(nèi)存

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

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

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

3、混合回收

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

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

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

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

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

1、對(duì)象如何進(jìn)入老年代

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2、設(shè)置堆大小

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

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

3、元空間設(shè)置

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

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

4、GC停頓時(shí)間

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

-XX:MaxGCPauseMillis=200

5、新生代大小

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

新生代內(nèi)部細(xì)化為 Eden區(qū)和兩個(gè) Survivor ,默認(rèn)比例是: 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的對(duì)象,假設(shè)每次YGC根據(jù)預(yù)先設(shè)置的最長(zhǎng)停頓時(shí)間都能夠掃描到Eden Region,那么此并發(fā)系統(tǒng)大約每隔10秒需要進(jìn)行一次YGC。

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

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

1、頻繁的YGC

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

2、頻繁的Mixed GC

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

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

(1)大對(duì)象

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

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

(2)元空間

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

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

3、Full GC

盡管Mixed GC被觸發(fā)時(shí),應(yīng)用會(huì)暫時(shí)停止響應(yīng)(默認(rèn)值是200毫秒),暫停的時(shí)間是相對(duì)可控的。

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

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

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

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

相關(guān)文章

  • SpringBoot3.1.2 引入Swagger報(bào)錯(cuò)Type javax.servlet.http.HttpServletRequest not present解決辦法

    SpringBoot3.1.2 引入Swagger報(bào)錯(cuò)Type javax.servlet.http

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

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

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

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

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

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

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

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

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

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

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

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

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

    java實(shí)現(xiàn)簡(jiǎn)單的拼圖游戲

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

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

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

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

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

最新評(píng)論