在没有实际负载增加的情况下,Java 9 G1工作约6小时后为什么会出现性能下降?

Dmi*_*kiy 48 java performance garbage-collection g1gc java-9

我将1个实例(2个vCPU,2GB RAM,加载〜4k req/sec)切换到Java 9(来自最新的Java 8).有一段时间,一切都很好,CPU使用率和以前一样.然而,在大约6小时后,CPU消耗无缘无故地增加了4%(从21%增加到25%).我没有流量峰值,没有内存消耗增加,没有度量标准更改(我在代码中的每个方法都有计数器).没有.

我离开这个实例大约12个小时,期待它会恢复原状.但没有改变.它开始消耗更多的CPU.

top命令显示实例的CPU峰值比Java服务器进程通常多.我最近读到G1不适合高吞吐量.所以我得出结论,理由可能在G1.

我重新启动了实例:

java -XX:+UseParallelGC -jar server-0.28.0.jar
Run Code Online (Sandbox Code Playgroud)

经过约20小时的监测,一切都和以前一样好.与前几天相比,CPU消耗量达到了21%的水平.

Java 9部署后的CPU使用率(6小时):

在此输入图像描述

7小时后CPU增加+ 12小时"未触及"(7d比例):

在此输入图像描述

CPU后 - XX:+UseParallelGC(24h刻度):

在此输入图像描述

所以我的问题是 - 是G1的预期行为吗?其他人看到类似的东西?

Ubuntu 16.04 x64

java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
Run Code Online (Sandbox Code Playgroud)

编辑03.01.2019

试图在java 10.0.2上使用G1运行一个相同的服务器:

java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)
Run Code Online (Sandbox Code Playgroud)

UseParallelGC服务器重启后,G1消耗的CPU比刚刚多40%.

Ago*_*ath 2

(请注意,GC 调优极其依赖于环境,因此没有灵丹妙药。)

G1 也有类似的问题。默认情况下,它似乎不太适合 REST 端点(同样,这只是我在我的直接邻居中经历的)。对我有帮助的是尝试 GC 标志,如此处所述

对于我们来说,最大的改进来自 -XX:G1NewSizePercent=25 和 -XX:MaxGCPauseMillis=50。G1 还会随着时间的推移自动调整自身,因此最大值。GC 暂停限制对所有其他参数都有显着影响。