2013-02-28 77 views
0

我有一个问题,让我发疯,需要你的帮助。 设置如下: - 处理器4核+ HT(so linux说8 cpu) - centos - glassfish 3(最新版本) - 对glassfish只有一个应用程序正在运行,http-listener1侦听端口8080管理侦听器上,HTTPS关) - 有一个连接池Java Glassfish问题

一切正常,因为它应该几天,然后突然停止: - 负荷变为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

垃圾收集是你应该看看... – ppeterka 2013-02-28 15:05:31

+0

如果它是GC它会恢复工作几分钟后,当它卡住它停留几天 – user2120041 2013-02-28 15:09:41

+0

检查线程转储也可能是一些东西看看。也许它揭示了这个过程实际上在做什么。 – jarnbjo 2013-02-28 15:27:57

回答

0

去这800%的CPU使用率看起来你有一个分配失败。

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

  • 您的服务器完全停止
  • 的ParallelGC试图尽可能快地完成,利用一切可能的CPU

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

一旦您有GC日志,请尝试使用the following scripts来查看iCMS占空比是否确实在10%左右的CPU使用率。更详细的解释可在here

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

希望有所帮助!

2

一台服务器可以进入几乎无限期GC抖动。如果这种情况在服务器上运行了大约3.5小时,而没有抛出OutOfMemory错误...

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

,然后修复的情况。

  • 此外,它可能发生没有内存泄漏,只需GC settings需要调整。
  • 这可能是明智的,打开GC logging,看看是在