我将一个实例(2 vCPU、2GB RAM,负载约为4k req/sec)从最新的Java 8切换到Java 9。一开始一切都很好,CPU使用率与之前相同。然而,大约6小时后,CPU消耗增加了4%(从21%增加到25%),原因不明。我没有流量激增,没有增加内存消耗,没有度量变化(我对代码中的每个方法都进行了计数)。没有任何变化。
我让这个实例保持不变约12小时,期望它会恢复正常。但是什么也没变。它只是继续消耗更多的CPU。
top
命令显示该实例的Java服务器进程比通常有更多的CPU波动。我最近读到G1不适合高吞吐量。所以我得出结论,原因可能在于G1。
我使用以下命令重新启动了实例:
java -XX:+UseParallelGC -jar server-0.28.0.jar
经过约20小时的监控,一切都和以前一样。CPU消耗量与许多天前相同,保持在21%的水平。
Java 9部署后的CPU使用情况(6小时尺度):
7小时+ 12小时“未更改”后的CPU增加(7天尺度):
-XX:+UseParallelGC
之后的CPU(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)
编辑 2019年03月01日
尝试在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%。
java -jar server.java
即可。 - Dmitriy Dumanskiy