天天看點

從GC日志與GC調優着手聊一聊JVM的常用參數

1> 日志相關

  • **-XX:OnOutOfMemoryError --> OOM時輸出dump檔案
  • -XX:HeapDumpPath=./oom/ --> OOM時dump檔案的存儲位置
  • -XX:+PrintGC --> 列印GC日志
  • -XX:+PrintGCDetails --> 列印GC詳細日志
  • -XX:+PrintGCCause --> 列印GC的原因
  • -XX:+PrintGCTimeStamps --> 輸出GC發生的時間
  • -XX:+PrintHeapAtGC --> 在GC發生時前後,列印堆棧日志
  • -Xloggc:opt/log/gc.log --> 日志輸出的檔案
-Xloggc:./logs/gc/cache-gc-%t.log      
  • -XX:+UseGCLogFileRotation --> 滾動記錄GC日志
  • -XX:NumberOfGCLogFiles=5 --> GC日志檔案的數量
  • -XX:GCLogFileSize=20M --> 每個GC日志檔案的最大容量

2> GC基礎環境

  • **-Xmn -Xms -Xmx -Xss

    年輕代 最小堆 最大堆 棧空間

  • -XX:+DisableExplictGC--> 禁用顯式GC(System.gc())
  • -XX:MaxTenuringThreshold --> 升代年齡,最大值15
  • 設定元空間的初始大小、最大空間:
  • -XX:MetaspaceSize=50m --> 設定元空間初始大小
  • -XX:MaxMetaspaceSize=100m --> 設定元空間的最大空間

3> 針對PS、PO垃圾回收器

  • -XX:PreTenureSizeThreshold -->大對象到底多大
  • -XX:SurvivorRatio --> 新生代eden區和Survivor區的比例
  • 預設為8,代碼兩個survivor區各占1份,eden區占8份
  • -XX:MaxTenuringThreshold=n --> 新生代經曆多少次GC晉升到老年代中的最大門檻值
  • -XX:+UseAdaptiveSizePolicy --> 自動選擇各區大小比例
  • JVM會根據目前系統動态調整-Xmn、-XX:SurvivotRatio等參數,來提供更合适的停頓時間或最大的吞吐量。
  • 推薦隻設定好記憶體資料大小-Xmx、使用-XX:MaxGCPauseMillis、-XX:GCTimeRatio給JVM設定一個優化目标。然後使用自适應調節政策。
  • -XX:+ParallelGCThreads

    并行收集器的線程數,同樣适用于CMS,一般設為和CPU核數相同

4> CMS

  • -XX:+UseConcMarkSweepGC --> 使用CMS垃圾回收器
  • -XX:CMSInitiatingOccupancyFraction
  • 表示使用多少比例的老年代後開始CMS收集,預設是68%(近似值),如果頻繁發生SerialOld卡頓,應該調小,(但是會頻繁CMS回收)
  • -XX:+UseCMSCompactAtFullCollection --> 在FGC時進行壓縮
  • -XX:CMSFullGCsBeforeCompaction**=4** --> 多少次FGC之後進行壓縮
  • XX:+CMSScavengeBeforeRemark --> 重新标記之前進行一個YGC,減少重新标記階段STW的時間
  • -XX:+CMSParallelInitialMarkEnabled --> 可以開啟初始标記并行化加快此階段處理速度。
  • 線程數不要超過CPU核數。
  • -XX:ParallelCMSThreads --> CMS線程數量,最好核心線程數量的一半;

5> G1

  • -XX:+UseG1GC --> 使用G1垃圾回收器
  • -XX:G1NewSizePercent --> 新生代最小比例,預設為5%
  • -XX:G1MaxNewSizePercent=n --> 新生代最大比例,預設為60%
  • -XX:MaxGCPauseMillis=n --> 一次GC的最大STW時間(機關:ms,預設200ms),G1會嘗試調整Young區的塊數來達到這個值。
  • -XX:+G1HeapRegionSize=n —> 分區大小,建議逐漸增大該值,1 2 4 8 16 32。
  • 随着size增加,垃圾的存活時間更長,GC間隔更長,但每次GC的時間也會更長

    ZGC做了改進(動态區塊大小)

  • -XX:InitiatingHeapOccupancyPercent=45 --> 老年代占用空間達到整堆記憶體門檻值(預設45%)時,啟動MixedGC;回收所有的Young和部分Old,以及大對象區。