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

时间:2017-10-05 09:44:46

标签: java performance garbage-collection java-9 g1gc

我将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

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

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

enter image description here

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

enter image description here

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

enter image description here

所以我的问题是 - 是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)

编辑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)
在服务器重启后,

G1消耗的CPU比UseParallelGC多40%。

1 个答案:

答案 0 :(得分:2)

(请注意,GC调整非常依赖于环境,因此没有神奇的配方。)

G1存在非常相似的问题。默认情况下,它似乎非常不适合REST端点(同样,这只是我在我的直接邻居中经历的)。如here所述,对我有用的是尝试使用GC标志。

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