G1垃圾回收性能調優

1.gc參數配置:併發

-XX:+UseG1GCjvm

使用 G1 垃圾收集器spa

-XX:MaxGCPauseMillis=200線程

設置指望達到的最大GC停頓時間指標(JVM會盡力實現,但不保證達到)日誌

-XX:InitiatingHeapOccupancyPercent=45對象

啓動併發GC週期時的堆內存佔用百分比. G1之類的垃圾收集器用它來觸發併發GC週期,基於整個堆的使用率,而不僅是某一代內存的使用比值爲 0 則表示一直執行GC循環」. 默認值爲 45.排序

-XX:NewRatio=n內存

新生代與老生代(new/old generation)的大小比例(Ratio). 默認值爲 2.it

-XX:SurvivorRatio=nio

eden/survivor 空間大小的比例(Ratio). 默認值爲 8.

-XX:MaxTenuringThreshold=n

提高年老代的最大臨界值(tenuring threshold). 默認值爲 15.

-XX:ParallelGCThreads=n

設置垃圾收集器在並行階段使用的線程數,默認值隨JVM運行的平臺不一樣而不一樣.

-XX:ConcGCThreads=n

併發垃圾收集器使用的線程數量默認值隨JVM運行的平臺不一樣而不一樣.

-XX:G1ReservePercent=n

設置堆內存保留爲假天花板的總量,以下降提高失敗的可能性默認值是 10.

-XX:G1HeapRegionSize=n

使用G1Java堆會被分爲大小統一的的區(region)。此參數能夠指定每一個heap區的大小默認值將根據 heap size 算出最優解最小值爲1Mb, 最大值爲 32Mb.

 

2.jvm日誌參數配置-Xmx10M -Xmn10M -XX:+PrintGCTimeStamps -XX:+UseG1GC  -XX:+PrintGCDetails -Xloggc:./gclogs

3.最佳實踐

3.1 不要設置年輕代的大小(Young Generation Size)

倘若經過 -Xmn 顯式地指定了年輕代的大小, 則會干擾到 G1收集器的默認行爲.

  • G1在垃圾收集時將再也不關心暫停時間指標. 因此從本質上說,設置年輕代的大小將禁用暫停時間目標.
  • G1在必要時也不可以增長或者縮小年輕代的空間. 由於大小是固定的,因此對更改大小無能爲力

3.2 什麼是轉移失敗(Evacuation Failure)

對 survivors 或 promoted objects 進行GC時,若是JVM的heap區不足,就會發生提高失敗(promotion failure)。堆內存不能繼續擴充,由於已經達到最大值了。當使用 -XX:+PrintGCDetails 時將會在GC日誌中顯示 to-space overflow (to-空間溢出)。

GC仍繼續因此空間必須被釋放,拷貝失敗的對象必須被放到正確的位置(tenured in place),CSet指向區域中的任何 RSets 更新都必須從新生成(regenerated),全部這些步驟都是代價高昂的

3.3 如何避免轉移失敗(Evacuation Failure)

要避免避免轉移失敗, 考慮採納下列選項:

  • 增長堆內存大小 
    • 增長 -XX:G1ReservePercent=n, 其默認值是 10.
    • G1建立了一個假天花板(false ceiling),在須要更大 ‘to-space’ 的狀況下會嘗試從保留內存獲取(leave the reserve memory free).
  • 更早啓動標記週期(marking cycle)
  • 經過採用 -XX:ConcGCThreads=n 選項增長標記線程(marking threads)的數量.

4日誌格式分析

4.1 日誌格式

3種日誌詳情格式:

  • -verbosegc。和-XX:+PrintGC等效,日誌級別爲fine
  • -XX:+PrintGCDetails。日誌級別爲finer,包含的信息比較完整。
  • -XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=finest。日誌級別爲finest,包含finer信息以及每一個工做線程的信息。

2種時間戳格式:

  • -XX:+PrintGCTimeStamps。毫秒時間。
  • -XX:+PrintGCDateStamps。日期時間。

-XX:+PrintGCDetails日誌示例:

0.522: [GC pause (young), 0.15877971 secs]                                         // 程序運行0.522秒後發生一個Evacuation Pause,耗時0.15877971秒。

      [Parallel Time: 157.1 ms]                                                    // 並行GC耗時157.1 ms         

         [GC Worker Start (ms):  522.1  522.2 522.2  522.2                        // 每一個工做線程啓動時間,時間根據線程id排序

          Avg: 522.2, Min: 522.1, Max: 522.2, Diff:   0.1]                         // 全部工做線程啓動時間的平均值、最小值、最大值、差異

         [Ext Root Scanning (ms):  1.6  1.5 1.6  1.9                              // 每一個掃描root的線程耗時

          Avg:   1.7, Min:   1.5, Max:  1.9, Diff:   0.4]                         

         [Update RS (ms):  38.7  38.8 50.6  37.3                                  // 每一個執行更新RS(Remembered Sets)的線程的耗時

          Avg:  41.3, Min:  37.3, Max: 50.6, Diff:  13.3]                         

            [Processed Buffers : 2 2 3 2                                           // 每一個工做線程執行UB(Update Buffers)的數量

              Sum: 9, Avg: 2, Min: 2, Max: 3, Diff: 1]                              

         [Scan RS (ms):  9.9  9.7 0.0  9.7                                        // 每一個工做線程掃描RS的耗時

          Avg:   7.3, Min:   0.0, Max:  9.9, Diff:   9.9]                         

         [Object Copy (ms):  106.7  106.8 104.6  107.9                            // 每一個工做線程執行OC(Object Copy)的耗時

          Avg: 106.5, Min: 104.6, Max: 107.9, Diff:   3.3]                         

         [Termination (ms):  0.0  0.0 0.0  0.0                                    // 每一個工做線程執行終止的耗時

          Avg:   0.0, Min:   0.0, Max:  0.0, Diff:   0.0]

            [Termination Attempts : 1 4 4 6                                        // 每一個工做線程執行終止的重試的次數

              Sum: 15, Avg: 3, Min: 1, Max: 6, Diff: 5]

         [GC Worker End (ms):  679.1  679.1 679.1  679.1                          // 每一個工做線程終止時的時間

          Avg: 679.1, Min: 679.1, Max: 679.1, Diff:   0.1]

         [GC Worker (ms):  156.9  157.0 156.9  156.9                              // 每一個工做線程的生命時間

          Avg: 156.9, Min: 156.9, Max: 157.0, Diff:   0.1]

         [GC Worker Other (ms):  0.3  0.3 0.3  0.3                                // 每一個工做線程執行其餘任務(上述未統計的內容)的耗時

          Avg:   0.3, Min:   0.3, Max:  0.3, Diff:   0.0]

      [Clear CT:   0.1 ms]                                                        // 清理CT(Card Table)的耗時

      [Other:   1.5 ms]                                                           // 其餘任務(上述未統計的內容)的耗時

         [Choose CSet:   0.0 ms]                                                   //選擇分區的耗時

         [Ref Proc:   0.3 ms]                                                     // 執行關聯(Reference objects)的耗時

         [Ref Enq:   0.0 ms]                                                      // 將references放入ReferenceQueues的耗時

         [Free CSet:   0.3 ms]                                                    // 釋放CS(collection set)的耗時

      [Eden: 12M(12M)->0B(10M) Survivors: 0B->2048K Heap: 13M(64M)->9739K(64M)]    // Eden容量爲12M,使用了12M,GC後變爲0,容量目標大小增長到13M。

                                                                                   // SurvivorsGC前爲0,GC後變爲2048K

                                                                                   // GC前,Heap容量爲64M,使用13M;GC後,Heap容量爲64M,使用9739k。

    [Times: user=0.59 sys=0.02, real=0.16 secs]

相關文章
相關標籤/搜索