为什么在Java 9 G1工作6个小时后性能下降,而实际负载却没有增加?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (109)

我将1个实例(2个vCPU,2GB RAM,加载〜4k req / sec)切换到Java 9(来自最新的Java 8)。有一段时间,一切都很好,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小时后CPU增加+ 12小时“未触及”(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)
提问于
用户回答回答于

我没有一个明确的答案,但是我们使用psi-probe来监视我们的JVM(我们的应用程序容器--Tomcat 8+使用JDK 1.8来提供动态页面),它可以为您提供JVM内存利用率的完美情况(Eden,幸存者,旧世代等),以及CPU利用率,希望能帮助你看到你正在使用的垃圾收集器算法的问题。

psi探头易于部署到任何环境 - 无论是生产还是开发。如果我是你的话,我也会继续,并且在你的DEVEL环境中启用gc日志记录,并进行一些负载测试(在这种情况下我总是将JMeter看作一个非常方便的工具 - 简单但功能强大)来查看是否我可以复制这个问题。使用psi-probe实时推送不同的负载并观察JVM行为。

扫码关注云+社区