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

标签 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 小时后 CPU 增加 + 12 小时“未触及”(7d 规模):

enter image description here

CPU 后 -XX:+UseParallelGC (24h scale):

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%。

最佳答案

(请注意,GC 调优非常依赖环境,因此没有神奇的秘诀。)

与 G1 有一个非常相似的问题。默认情况下,它似乎非常不适合 REST 端点(同样,这只是我在直接附近所经历的)。如 here 所述,对我有帮助的是尝试使用 Gcflags。 .

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

关于java - 为什么在 Java 9 G1 工作约 6 小时后性能会下降,而负载却没有实际增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46582523/

相关文章:

.net - 记录器实现中的 CloudQueue.BeginAddMessage

c# - 将列表中的项目分配给列表中的另一个项目的最快方法

android - 应用程序退出时如何销毁静态字段?

php - 有没有办法在 PHP 中跟踪垃圾收集器事件?

java - 将所有值映射到一个键

java - 使用 Arrays.asList 的优点和缺点

SQL Server 性能结果集与输出参数与返回值

C# 异步 TCP 及其闭包引用实例的垃圾回收?

java - 如何创建临时 jms 队列并按名称连接到它?

java - Double Check Lock 在此 java 代码上不起作用?