0

我有一个问题让我发疯,需要你的帮助。设置如下: - 处理器 4 核 + HT(所以 linux 说 8 cpus) - centos - glassfish 3(最新版本) - 在 glassfish 上只有一个应用程序正在运行,http-listener1 监听端口 8080(管理员监听器打开, https off) - 有一个连接池

一切正常运行了几天,然后突然停止: - 负载达到 400 - java 进程的 cpu 使用率达到 800 - gf 停止服务页面,或者它的服务非常慢: - 管理员侦听器(端口 4848)运行正常- 我启动分析器,一切似乎都运行良好,但我找不到问题所在

我没有更多的想法在哪里寻找以及如何解决问题。当大量用户访问该站点时似乎会出现此问题,但问题是即使没有任何用户,gf 也永远不会恢复。

有任何想法吗?

编辑从评论中粘贴 JVM 设置:

JVM设置:

<jvm-options>-Xms10240m</jvm-options> 
<jvm-options>-Xmx10240m</jvm-options> 
<jvm-options>-XX:CMSIncrementalDutyCycle=10</jvm-options>  
<jvm-options>-XX:CMSIncrementalDutyCycleMin=10</jvm-options>  
<jvm-options>-XX:+CMSIncrementalMode</jvm-options>  
<jvm-options>-XX:+CMSIncrementalPacing</jvm-options>  
<jvm-options>-XX:+UseConcMarkSweepGC</jvm-options>  
<jvm-options>-XX:MaxPermSize=512m</jvm-options>  
<jvm-options>-XX:NewRatio=2</jvm-options>  
<jvm-options>-XX:PermSize=512m</jvm-options>
4

2 回答 2

2

服务器可能会陷入几乎无限期的 GC 抖动。这种情况在服务器上持续了大约 3.5 小时,而没有引发 OutOfMemory 错误......

我们使用的框架中存在内存泄漏。我们做了什么:

然后,解决这种情况。

  • 此外,可能没有内存泄漏,只是需要调整GC 设置。
  • 打开GC 日志以查看发生了什么可能是明智的
于 2013-02-28T15:15:09.793 回答
0

这 800% 的 CPU 使用率看起来像是分配失败。

当您启用 CMS 时,GC 会尝试以比您的应用程序消耗的速度更快的速度释放内存。分配失败是指它不能满足此要求。在这种情况下,JVM 唯一的解决方案是使用 ParallelGC 运行完整的集合,这意味着:

  • 您的服务器已完全停止
  • ParallelGC 尝试尽可能快地完成,使用所有可能的 CPU

您应该启用 GC Logging 以确保此分配失败假设是正确的 ( -Xloggc:gc.log -XX:+PrintGCDetails)。每个“Full GC”行都是分配失败。

获得 GC 日志后,尝试使用以下脚本查看 iCMS 占空比是否真的在 10% 左右的 CPU 使用率。更详细的解释可以在这里找到

正如@ppeterka 所说,您可以分析您的应用程序以减少内存消耗,但您也可以给它更多内存。不要为-Xmsand设置相同的值-Xmx,并删除标志-XX:CMSIncrementalDutyCycleand -XX:CMSIncrementalDutyCycleMin

希望有帮助!

于 2013-04-13T09:04:49.563 回答