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,以及大對象區。