日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM从入门到精通(十一): CMS日志详解,G1日志详解,JVM常见参数总结;补充纤程知识

發布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的時候下面的輸出結果:

    [GC (Allocation Failure) [ParNew: 6144K->640K(6144K), 0.0265885 secs] 6585K->2770K(19840K), 0.0268035 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] // ParNew:年輕代收集器// 6144->640:收集前后的對比//(6144):整個年輕代容量// 6585 -> 2770:整個堆的情況// (19840):整個堆大小 [GC (CMS Initial Mark) [1 CMS-initial-mark: 8511K(13696K)] 9866K(19840K), 0.0040321 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] //8511 (13696) : 老年代使用(最大)//9866 (19840) : 整個堆使用(最大) [CMS-concurrent-mark-start] [CMS-concurrent-mark: 0.018/0.018 secs] [Times: user=0.01 sys=0.00, real=0.02 secs] //這里的時間意義不大,因為是并發執行 [CMS-concurrent-preclean-start] [CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] //標記Card為Dirty,也稱為Card Marking [GC (CMS Final Remark) [YG occupancy: 1597 K (6144 K)][Rescan (parallel) , 0.0008396 secs][weak refs processing, 0.0000138 secs][class unloading, 0.0005404 secs][scrub symbol table, 0.0006169 secs][scrub string table, 0.0004903 secs][1 CMS-remark: 8511K(13696K)] 10108K(19840K), 0.0039567 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] //STW階段,YG occupancy:年輕代占用及容量//[Rescan (parallel):STW下的存活對象標記//weak refs processing: 弱引用處理//class unloading: 卸載用不到的class//scrub symbol(string) table: //cleaning up symbol and string tables which hold class-level metadata and //internalized string respectively//CMS-remark: 8511K(13696K): 階段過后的老年代占用及容量//10108K(19840K): 階段過后的堆占用及容量 [CMS-concurrent-sweep-start] [CMS-concurrent-sweep: 0.005/0.005 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] //標記已經完成,進行并發清理 [CMS-concurrent-reset-start] [CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]//重置內部結構,為下次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常见参数总结;补充纤程知识的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。