2 回答
TA贡献1828条经验 获得超6个赞
查看您的 GC 日志,CMS 似乎不是您应用的正确选择。
考虑尝试其他 GC 算法:
并行 GC(它会给你 10-30 秒的定期暂停,但不是 10 分钟)
如果你可以升级到 Java 8,G1 可能是一个选项(它可能很好也可能很坏——看你的运气了)
如果您想坚持使用 CMS ...
...我可以在GC日志中看到有关“提升失败”和“并发模式失败”的信息,而且GC非常耗时,几乎需要10分钟才能完成一个GC周期...
您的提升率非常高(100+ MiB/s)
2019-08-17T11:07:38.895+0800: 48789.385: [GC2019-08-17T11:07:38.895+0800: 48789.385: [ParNew: 5098592K->576704K(5190464K), 0.2818390 secs] 16761372K->12241212K(22491968K), 0.2826330 secs] [Times: user=2.2
4 sys=0.00, real=0.28 secs]
2019-08-17T11:07:46.308+0800: 48796.799: [GC2019-08-17T11:07:46.309+0800: 48796.799: [ParNew: 5190464K->576704K(5190464K), 0.4371320 secs] 16854972K->12504773K(22491968K), 0.4380620 secs] [Times: user=2.9
7 sys=0.01, real=0.44 secs]
CMS 需要很大的旧空间大小来处理这样的吞吐量并保持低碎片。不过,您的服务器似乎已经达到内存限制。
TA贡献1795条经验 获得超7个赞
我终于弄清楚了根本原因。代码在高峰流量到来时会产生大量对象(超过10GB),导致young GC频繁发生,CMS GC回落到SerialOld GC,造成长时间STW。
添加回答
举报