JVM从入门到精通(十一): CMS日志详解,G1日志详解,JVM常见参数总结;补充纤程知识
CMS 日志格式分析
使用CMS:添加參數UserConcMarkSweepGC(CMS+ParNew)
CMS常用參數
- -XX:+UseConcMarkSweepGC
- -XX:ParallelCMSThreads
CMS線程數量 - -XX:CMSInitiatingOccupancyFraction
使用多少比例的老年代后開始CMS收集,默認是68%(近似值),如果頻繁發生SerialOld卡頓,應該調小,(但是調小的缺點是頻繁CMS回收),這個參數可能會問到,你不背下來,只要知道有這么個參數可以調,就可以了。 - -XX:+UseCMSCompactAtFullCollection
在FGC時進行壓縮 - -XX:CMSFullGCsBeforeCompaction
多少次FGC之后進行壓縮 - -XX:+CMSClassUnloadingEnabled
- -XX:CMSInitiatingPermOccupancyFraction
達到什么比例時進行Perm回收 - GCTimeRatio
設置GC時間占用程序運行時間的百分比 - -XX:MaxGCPauseMillis
停頓時間,是一個建議時間,GC會嘗試用各種手段達到這個時間,比如減小年輕代
CMS的問題
Memory Fragmentation
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction 默認為0 指的是經過多少次FGC才進行壓縮
Floating Garbage
Concurrent Mode Failure
產生:if the concurrent collector is unable to finish reclaiming the unreachable objects before the tenured generation fills up, or if an allocation cannot be satisfiedwith the available free space blocks in the tenured generation, then theapplication is paused and the collection is completed with all the applicationthreads stopped
解決方案:降低觸發CMS的閾值
PromotionFailed
解決方案類似,保持老年代有足夠的空間
–XX:CMSInitiatingOccupancyFraction 92% 可以降低這個值,讓CMS保持老年代足夠的空間
CMS日志分析
執行命令:java -Xms20M -Xmx20M -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC com.mashibing.jvm.gc.T15_FullGC_Problem01
在下面這個例子中,一開始是年輕代的ParNew的GC,后來ParNew達到一定容量的時候,出發了CMS對于老年代的回收。
會看到在GC的時候下面的輸出結果:
G1 日志格式分析
如果你生產是 1.8 的 jdk,你就可以用 G1 了。推薦你使用。
執行命令:java -Xms20M -Xmx20M -XX:+PrintGCDetails -XX:+Use G1GC com.mashibing.jvm.gc.T15_FullGC_Problem01
可以看到回收時的日志輸出:
G1日志詳解
[GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.0015790 secs] //young -> 年輕代 Evacuation-> 復制存活對象 //initial-mark 混合回收的階段,這里是YGC混合老年代回收[Parallel Time: 1.5 ms, GC Workers: 1] //一個GC線程[GC Worker Start (ms): 92635.7][Ext Root Scanning (ms): 1.1][Update RS (ms): 0.0][Processed Buffers: 1][Scan RS (ms): 0.0][Code Root Scanning (ms): 0.0][Object Copy (ms): 0.1][Termination (ms): 0.0][Termination Attempts: 1][GC Worker Other (ms): 0.0][GC Worker Total (ms): 1.2][GC Worker End (ms): 92636.9][Code Root Fixup: 0.0 ms][Code Root Purge: 0.0 ms][Clear CT: 0.0 ms][Other: 0.1 ms][Choose CSet: 0.0 ms][Ref Proc: 0.0 ms][Ref Enq: 0.0 ms][Redirty Cards: 0.0 ms][Humongous Register: 0.0 ms][Humongous Reclaim: 0.0 ms][Free CSet: 0.0 ms][Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)][Times: user=0.00 sys=0.00, real=0.00 secs] //以下是混合回收其他階段 [GC concurrent-root-region-scan-start] [GC concurrent-root-region-scan-end, 0.0000078 secs] [GC concurrent-mark-start] //無法evacuation,進行FGC [Full GC (Allocation Failure) 18M->18M(20M), 0.0719656 secs][Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)], [Metaspace: 38 76K->3876K(1056768K)] [Times: user=0.07 sys=0.00, real=0.07 secs]G1常用參數
- -XX:+UseG1GC
- -XX:MaxGCPauseMillis
建議值,G1會嘗試調整Young區的塊數來達到這個值 - -XX:GCPauseIntervalMillis
?GC的間隔時間 - -XX:+G1HeapRegionSize
分區大小,建議逐漸增大該值,1 2 4 8 16 32。
隨著size增加,垃圾的存活時間更長,GC間隔更長,但每次GC的時間也會更長
ZGC做了改進(動態區塊大小) - G1NewSizePercent
新生代最小比例,默認為5% - G1MaxNewSizePercent
新生代最大比例,默認為60% - GCTimeRatio
GC時間建議比例,G1會根據這個值調整堆空間 - ConcGCThreads
線程數量 - InitiatingHeapOccupancyPercent
啟動G1的堆空間占用比例
GC常用參數
- -Xmn -Xms -Xmx -Xss
年輕代 最小堆 最大堆 棧空間 - -XX:+UseTLAB
使用TLAB,默認打開 - -XX:+PrintTLAB
打印TLAB的使用情況 - -XX:TLABSize
設置TLAB大小 - -XX:+DisableExplictGC
讓System.gc()不管用 ,避免有的小伙伴手動調用GC,觸發的就是FGC - -XX:+PrintGC
- -XX:+PrintGCDetails
- -XX:+PrintHeapAtGC
- -XX:+PrintGCTimeStamps
- -XX:+PrintGCApplicationConcurrentTime (重要性低)
打印應用程序時間 - -XX:+PrintGCApplicationStoppedTime (重要性低)
打印暫停時長 - -XX:+PrintReferenceGC (重要性低)
記錄回收了多少種不同引用類型的引用 - -verbose:class
類加載詳細過程 - -XX:+PrintVMOptions
打印JVM運行的時候的參數 - -XX:+PrintFlagsFinal 查看最終參數 或者 -XX:+PrintFlagsInitial 查看默認參數
必須會用,例如java -XX:+PrintFlagsFinal -version | grep CMSInitiatingOccupancyFraction - -Xloggc:opt/log/gc.log
- -XX:MaxTenuringThreshold
GC升代年齡,最大值15 - 鎖自旋次數 -XX:PreBlockSpin 熱點代碼檢測參數-XX:CompileThreshold 逃逸分析 標量替換 …
這些不建議設置
Parallel常用參數
- -XX:SurvivorRatio
- -XX:PreTenureSizeThreshold
大對象到底多大,會被直接分配到old區 - -XX:MaxTenuringThreshold
- -XX:+ParallelGCThreads
并行收集器的線程數,同樣適用于CMS,一般設為和CPU核數相同即可,默認值也是自己這樣監測的。 - -XX:+UseAdaptiveSizePolicy
自動選擇各區大小比例
補充纖程知識
總結
以上是生活随笔為你收集整理的JVM从入门到精通(十一): CMS日志详解,G1日志详解,JVM常见参数总结;补充纤程知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 响应式web(一):什么是响应式web,
- 下一篇: 高并发负载均衡(一):网络协议原理