最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)存應(yīng)為1MB*2048=2GB,低于此值建議使用其它垃圾回收器。

2、Region大小

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

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

3、獲取默認值

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

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

三種GC模式

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

1、新生代回收

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

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

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

2、混合回收

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

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

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

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

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

3、Full GC

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

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

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

默認參數(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,回收線程與應(yīng)用線程并發(fā)進行,垃圾回收對應(yīng)用透明進行,假如CPU算力充足的話,應(yīng)用幾乎感覺不到垃圾在回收進行。

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

1、對象如何進入老年代

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

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

新創(chuàng)建的對象如果過大,那么不經(jīng)過新生代,直接進入老年代??刂茖ο蟠笮¢撝涤袇?shù)-XX:PretenureSizeThreshold決定,單位字節(jié)。

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

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

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

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

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

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

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

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

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

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

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

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

2、設(shè)置堆大小

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

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

2、頻繁的Mixed GC

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

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

(1)大對象

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

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

(2)元空間

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

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

3、Full GC

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

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

進入Serial Old GC垃圾回收狀態(tài),垃圾回收不再受最長回收時間約束,采用單線程進行標記、清理和壓縮整理,應(yīng)用可能進入假死狀態(tài)。也許重啟應(yīng)用,重新分配堆內(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)文章

  • JDBC如何獲取數(shù)據(jù)庫連接

    JDBC如何獲取數(shù)據(jù)庫連接

    這篇文章主要為大家詳細為大家詳細介紹了JDBC如何獲取數(shù)據(jù)庫連接,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 解決Spring Boot中Druid連接池“discard long time none received connection“警告

    解決Spring Boot中Druid連接池“discard long time 

    本文主要介紹了解決Spring Boot中Druid連接池“discard long time none received connection“警告,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • IDEA生成標準JavaBean的幾種方法總結(jié)

    IDEA生成標準JavaBean的幾種方法總結(jié)

    標準javaBean是定義一個類的標準結(jié)構(gòu),下面這篇文章主要給大家總結(jié)介紹了關(guān)于IDEA生成標準JavaBean的幾種方法,文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Spring中的事務(wù)管理及實現(xiàn)方式解析

    Spring中的事務(wù)管理及實現(xiàn)方式解析

    這篇文章主要介紹了Spring中的事務(wù)管理及實現(xiàn)方式解析,Spring事務(wù)管理基于底層數(shù)據(jù)庫本身的事務(wù)處理機制,數(shù)據(jù)庫事務(wù)的基礎(chǔ),是掌握Spring事務(wù)管理的基礎(chǔ),這篇總結(jié)下Spring事務(wù),需要的朋友可以參考下
    2024-01-01
  • Java如何獲取主機的基本信息詳解

    Java如何獲取主機的基本信息詳解

    最近遇到一個工作需求,上網(wǎng)查了一下怎樣在Java中獲取本機的ip和主機名,所以下面這篇文章主要給大家介紹了關(guān)于Java如何獲取主機的基本信息,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • Java中SpringCloud的五大組件詳解

    Java中SpringCloud的五大組件詳解

    這篇文章主要介紹了Java中SpringCloud的五大組件詳解,Spring cloud是一個基于Spring Boot實現(xiàn)的服務(wù)治理工具包,在微服務(wù)架構(gòu)中用于管理和協(xié)調(diào)服務(wù),需要的朋友可以參考下
    2023-07-07
  • Java接口返回json如何忽略特定屬性

    Java接口返回json如何忽略特定屬性

    這篇文章主要介紹了Java接口返回json如何忽略特定屬性,通過SimplePropertyPreFilter方式(Json返回),這種寫法,接口返回類型就要求是Json字符串類型,本文通過場景實例代碼相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 詳解Java8中接口的默認方法和靜態(tài)方法

    詳解Java8中接口的默認方法和靜態(tài)方法

    Java 8是Java語言的一個重要版本,其中引入了許多新特性和改進,其中一個值得關(guān)注的特性是接口的默認方法和靜態(tài)方法,本文就來和大家簡單講講吧
    2023-05-05
  • Spring通過三級緩存解決循環(huán)依賴問題的過程詳解

    Spring通過三級緩存解決循環(huán)依賴問題的過程詳解

    循環(huán)依賴指的是在對象之間存在相互依賴關(guān)系,形成一個閉環(huán),導(dǎo)致無法準確地完成對象的創(chuàng)建和初始化,本文主要介紹了Spring通過三級緩存解決循環(huán)依賴的方法,需要的可以參考下
    2023-10-10
  • redis.clients.jedis.exceptions.JedisMovedDataException異常解決

    redis.clients.jedis.exceptions.JedisMovedDataException異常解決

    redis.clients.jedis.exceptions.JedisMovedDataException?異常是在使用?Jedis?客戶端與?Redis?集群進行交互時發(fā)生的,下面就來介紹一下解決方法,感興趣的可以了解一下
    2024-05-05

最新評論

开阳县| 高雄县| 济阳县| 新绛县| 河池市| 柳河县| 囊谦县| 西林县| 营口市| 仙桃市| 河津市| 宜黄县| 五家渠市| 宁夏| 八宿县| 寿光市| 西乌| 阳东县| 宁都县| 淳化县| 常州市| 云浮市| 甘泉县| 城固县| 武鸣县| 普格县| 汶川县| 长宁县| 万州区| 七台河市| 临海市| 和田县| 施甸县| 隆林| 万源市| 宁波市| 响水县| 印江| 江都市| 百色市| 洱源县|