我将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小时):
7小时+ 12小时后CPU增加"未触动" (7d比例):
CPU后 - XX:+UseParallelGC
(24小时刻度):
所以我的问题是 - 是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%。
答案 0 :(得分:2)
(请注意,GC调整非常依赖于环境,因此没有神奇的配方。)
G1存在非常相似的问题。默认情况下,它似乎非常不适合REST端点(同样,这只是我在我的直接邻居中经历的)。如here所述,对我有用的是尝试使用GC标志。
对我们来说,最大的改进来自-XX:G1NewSizePercent = 25和-XX:MaxGCPauseMillis = 50。 G1也会随着时间的推移自动调整自身,因此最大GC暂停限制对所有其他参数都有重要影响。