Java Glassfish问题

时间:2013-02-28 15:02:58

标签: java glassfish

我有一个让我疯狂并需要你帮助的问题。 设置如下: - 处理器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>

2 个答案:

答案 0 :(得分:2)

服务器可以进入几乎无限期的GC颠簸。如果这种情况在服务器上持续了大约3.5小时,而没有抛出OutOfMemory错误......

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

然后,解决问题。

  • 此外,可能会发生没有内存泄漏,只需要调整GC settings
  • 打开GC logging以查看正在发生的事情
  • 可能是明智之举

答案 1 :(得分:0)

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

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

  • 您的服务器已完全停止
  • ParallelGC尝试使用每个可能的CPU
  • 尽快完成

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

获得GC日志后,请尝试使用the following scripts查看iCMS占空比是否真的大约为10%CPU使用率。有更详细的解释here

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

希望有所帮助!