我有一个让我疯狂并需要你帮助的问题。 设置如下: - 处理器4核+ HT(所以linux说8 cpus) - centos - glassfish 3(最新版本) - 在glassfish上只运行一个应用程序,http-listener1侦听端口8080(管理员监听器打开,https关闭) - 有一个连接池
一切都能正常工作几天,然后突然停止: - 负载达到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>
答案 0 :(得分:2)
服务器可以进入几乎无限期的GC颠簸。如果这种情况在服务器上持续了大约3.5小时,而没有抛出OutOfMemory错误......
我们使用的框架中有内存泄漏。我们做了什么:
jmap -dump
然后,解决问题。
答案 1 :(得分:0)
这800%的CPU使用率看起来像是分配失败。
启用CMS时,GC会尝试以比应用程序消耗的速度更快的速度释放内存。分配失败是指它无法满足此要求。在这种情况下,JVM唯一的解决方案是使用ParallelGC运行完整集合,这意味着:
您应启用GC Logging以确保此分配失败假设正确(-Xloggc:gc.log -XX:+PrintGCDetails
)。每个“Full GC”行都是分配失败。
获得GC日志后,请尝试使用the following scripts查看iCMS占空比是否真的大约为10%CPU使用率。有更详细的解释here。
正如@ppeterka所说,您可以分析您的应用程序以减少内存消耗,但您也可以为其提供更多内存。不要为-Xms
和-Xmx
设置相同的值,并删除标记-XX:CMSIncrementalDutyCycle
和-XX:CMSIncrementalDutyCycleMin
。
希望有所帮助!