首页 > 解决方案 > 使用 G1GC 在 Java8 中调整垃圾收集

问题描述

我们正在努力提高我们的应用程序性能并进行性能测试。我们有一个具有 4 个内核和 16 GB 内存的 Linux VM。该应用程序有 100 多个用户,并且抱怨运行缓慢。这是我们到目前为止所做的性能调整

<heap size="8192m" max-size="8192m"/>
            ***<jvm-options>
                <option value="-XX:+UseG1GC"/>
                <option value="-XX:+UseStringDeduplication"/>
                <option value="-verbose:gc"/>
                <option value="-XX:+PrintGCDetails"/>
                <option value="-XX:+PrintGCDateStamps"/>
                <option value="-XX:+PrintGCTimeStamps"/>
                <option value="-XX:+PrintGCApplicationStoppedTime"/>
                <option value="-XX:+UseGCLogFileRotation"/>
                <option value="-XX:NumberOfGCLogFiles=5"/>
                <option value="-XX:GCLogFileSize=3M"/>
                <option value="-XX:-TraceClassUnloading"/>
                <option value="-XX:+HeapDumpOnOutOfMemoryError"/>***

我们看到 11 秒的垃圾收集时间如下

    2021-09-14T18:43:27.186+1000: 14806.057: [GC pause (G1 Evacuation Pause) (young), 0.1189389 secs]
       [Parallel Time: 71.8 ms, GC Workers: 4]
          [GC Worker Start (ms): Min: 14806057.7, Avg: 14806057.7, Max: 14806057.7, Diff: 0.1]
          [Ext Root Scanning (ms): Min: 5.4, Avg: 6.9, Max: 8.9, Diff: 3.5, Sum: 27.5]
          [Update RS (ms): Min: 7.2, Avg: 9.0, Max: 9.7, Diff: 2.6, Sum: 35.8]
             [Processed Buffers: Min: 30, Avg: 33.2, Max: 38, Diff: 8, Sum: 133]
          [Scan RS (ms): Min: 0.3, Avg: 0.3, Max: 0.3, Diff: 0.1, Sum: 1.2]
          [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.1]
          [Object Copy (ms): Min: 54.7, Avg: 55.3, Max: 56.0, Diff: 1.4, Sum: 221.3]
          [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
             [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4]
          [GC Worker Other (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.3]
          [GC Worker Total (ms): Min: 71.5, Avg: 71.6, Max: 71.6, Diff: 0.1, Sum: 286.2]
          [GC Worker End (ms): Min: 14806129.2, Avg: 14806129.3, Max: 14806129.3, Diff: 0.1]
       [Code Root Fixup: 0.0 ms]
       [Code Root Purge: 0.0 ms]
       [String Dedup Fixup: 16.8 ms, GC Workers: 4]
          [Queue Fixup (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.1]
          [Table Fixup (ms): Min: 16.0, Avg: 16.3, Max: 16.6, Diff: 0.6, Sum: 65.3]
       [Clear CT: 0.5 ms]
       [Other: 29.8 ms]
          [Choose CSet: 0.0 ms]
          [Ref Proc: 26.7 ms]
          [Ref Enq: 0.9 ms]
          [Redirty Cards: 0.1 ms]
          [Humongous Register: 0.2 ms]
          [Humongous Reclaim: 0.1 ms]
          [Free CSet: 1.3 ms]
           [Eden: 4072.0M(4072.0M)->0.0B(4096.0M) Survivors: 98304.0K->86016.0K Heap: 7267.0M(8192.0M)->3187.9M(8192.0M)]
        [Times: user=0.38 sys=0.00, real=0.12 secs] 
    

我们如何降低它?我们计划向服务器添加 32 GB 内存并具有堆大小(最小和最大为 20 GB)

标签: g1gc

解决方案


日志中总的 GC 时间为 0.1189389 秒,大约是 118.9 毫秒,而不是 11 秒。

G1 中的MaxGCPauseMillis参数用于控制最大暂停时间。默认值为 200 毫秒。如果要减少暂停时间,可以考虑将 MaxGCPauseMillis 设置为所需的值。


推荐阅读