最新国产好看的视频,伊人天堂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的默認設置,因此G1垃圾回收器可以用很長時間,現(xiàn)階段垃圾回收器優(yōu)化意味著針對G1垃圾回收器優(yōu)化。

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

G1概覽

1、最大堆大小

G1管理的最大堆大小為64G。每個Region的大小通過-XX:G1HeapRegionSize來設置,大小為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)化與大對象有關,當對象占用內(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 不設置時啟發(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ū) 

垃圾在堆中流轉

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

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

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

1、對象如何進入老年代

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

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

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

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

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

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

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

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

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

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

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

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

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

1、設置垃圾回收器

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

2、設置堆大小

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

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

3、元空間設置

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

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

4、GC停頓時間

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

-XX:MaxGCPauseMillis=200

5、新生代大小

參數(shù)-XX:G1NewSizePercent設置新生代初始大小,默認為5%;參數(shù)-XX:G1MaxNewSizePercent設置新生代最大大小,默認為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

假設并發(fā)系統(tǒng)每秒創(chuàng)建500MB的對象,假設每次YGC根據(jù)預先設置的最長停頓時間都能夠掃描到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的實際耗時低于預設置的最長垃圾回收時間(默認200毫秒),以便能夠每次都能將新生代垃圾清理完成,盡可能延緩垃圾流向老年代。

2、頻繁的Mixed GC

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

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

(1)大對象

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

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

(2)元空間

元空間耗盡也會引發(fā)Mixed GC,考慮到元空間存儲內(nèi)容的特殊性,因元空間耗盡導致GC頻率提高并沒有很好的辦法。單純提高元空間大小會壓縮新生代大小,新生代變小,對象流轉到老年代的數(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)的關鍵是不要出現(xiàn)Full GC,因此對于敏感的參數(shù)千萬不要亂調(diào)優(yōu),否則不僅達不到理想想過,反而更糟糕。

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

相關文章

  • 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“警告,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • IDEA生成標準JavaBean的幾種方法總結

    IDEA生成標準JavaBean的幾種方法總結

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

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

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

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

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

    Java中SpringCloud的五大組件詳解

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

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

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

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

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

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

    循環(huán)依賴指的是在對象之間存在相互依賴關系,形成一個閉環(huán),導致無法準確地完成對象的創(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

最新評論

阳曲县| 台江县| 中超| 工布江达县| 托里县| 资中县| 武功县| 北川| 县级市| 台湾省| 安福县| 枣庄市| 绵竹市| 伊春市| 朝阳县| 邢台市| 新宾| 鞍山市| 宜兰市| 东台市| 金湖县| 汤原县| 乌拉特前旗| 沂水县| 成都市| 昌乐县| 衡山县| 新宁县| 洞口县| 沛县| 双城市| 和静县| 邹平县| 丰县| 鸡泽县| 武山县| 上高县| 丹棱县| 紫云| 巢湖市| 若尔盖县|