g1gc - 使用 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)
解决方案
日志中总的 GC 时间为 0.1189389 秒,大约是 118.9 毫秒,而不是 11 秒。
G1 中的MaxGCPauseMillis参数用于控制最大暂停时间。默认值为 200 毫秒。如果要减少暂停时间,可以考虑将 MaxGCPauseMillis 设置为所需的值。
推荐阅读
- mutt - 在 Mutt 中使用 FZF 选择附件
- java - 如何按日期对不同格式的游标或 sqlite 数据库进行排序?
- stl-format - 使用 FreeCAD python 将 .OBJ 文件转换为 STL
- java - 使用java流替换复杂代码
- azure - 如何使用 ARM 模板`contentVersion`?
- excel-formula - 如果工作表 1 的列中的日期也在工作表 2 的列中,如何使用工作表 2 中的一行数据自动填充工作表 3?
- javascript - Jquery更改标签文本,引导程序
- excel - “日期”设置为一般,应设置为 DATES
- xslt - 需要帮助使用 XSLT 在 XML 中查找第一个非空元素
- java - 使用 Java 8 将日期字符串从“ddMMM”转换为“yyyy-MM-dd”