gpt4 book ai didi

java GC CMS-initial-mark 减慢对高负载 tomcat 生产服务器的查询

转载 作者:行者123 更新时间:2023-11-28 22:30:07 24 4
gpt4 key购买 nike

我有一个正在处理网络请求的 java tomcat 应用程序。它应该尽可能快地执行每个 Web 请求。每秒我收到大约 4 个请求。我认真地优化了 servlet。现在它通常在不到 100 毫秒的时间内处理每个请求。但有时请求会在 200 毫秒后得到处理。如果我重新运行这些缓慢的请求,它们再次快于 100 毫秒。我启用了 GC 日志记录并发现几乎总是在每个“慢”请求之前我都有卡住 JVM 的 CMS-initial-mark:

[GC [1 CMS-initial-mark: 1411302K(1415616K)] 1912881K(2029056K), 0.3224110 secs] 
[Times: user=0.00 sys=0.00, real=0.32 secs]

而且大部分时间请求执行时间与 GC 收集时间在同一数量级。我使用带有 32GB RAM 的 8 核服务器。我的 JVM 设置是:

-Xmx2G -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails. 

我的操作系统是默认设置的最新 Debian。除了 mongodb,没有其他进程在运行。 top 命令输出中显示的唯一进程是 java,它使用大约 100% 的 CPU(我有 8 个 CPU,所以它只有 1/8 的负载)。

我该如何克服这个问题?还能确诊什么?

最佳答案

初始标记的时间长得惊人。这表明发生了一些奇怪的事情。可能是方法太大而无法编译(因为它超过 8 KB)

您可能有大量永久对象指向短期对象,但这不太可能导致如此长的延迟。这会给您的所有 CPU 带来负担。

重要的是您似乎占用了一个 CPU,这表明存在一个非常具体的问题(比如一个超大的方法)

我会考虑增加伊甸园大小以减少过早提升的数量。这可能会有所帮助,也可能会使情况变得更糟,具体取决于您在做什么。

与此同时,我会尝试使用并行收集器。您可能会发现它可以更好地处理您的用例。

顺便说一句,如果您花费 100 毫秒,您可能会从减少产生的垃圾量中获益。我会在内存分析器中查看您的分配并尝试减少它们。

关于java GC CMS-initial-mark 减慢对高负载 tomcat 生产服务器的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23552134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com