为什么这些Tomcat服务器的JVM每小时执行一次完整的GC?

use*_*909 29 java tomcat garbage-collection jvm

我们运行许多Tomcat服务器,并且观察到完全垃圾收集(GCs)通常每小时执行一次,特别是当内存使用率相对较低时.精确时间似乎与应用程序服务器启动的时间有关; 如果服务器在01:13启动,则完整GC在02:13完成,下一个完整GC将在03:13完成.我无法找到任何文档来解释这种行为.

这是一个问题,因为同时启动的服务器池都倾向于在大约同一时间执行完整的GC.如果GC延迟足够长,导致负载均衡器将服务器标记为关闭,则整个应用程序可能会脱机一段时间.如果完整的GC可以在一段时间内分配,那么没有两台服务器同时进行完整的GC会更好,但我找不到任何方法来控制这种行为.

有没有人见过这种行为?有没有办法影响这些"常规"完整的GC何时发生?

Jos*_*hDM 25

您的"常规"每小时GC可能是由于这个已知的错误," 当gcDaemonProtection = true时,JreMemoryLeakPreventionListener会每小时生成一个完整的GC ".

确认您的Tomcat版本以及您的gcDaemonProtection属性值JreMemoryLeakPreventionListener(默认值为true).

该补丁据称包含在Tomcat v.7.0.28 +和v.6.0.36 +中.

升级您的服务器,或从此处选择非升级解决方案,总结如下:

  1. 使用JVM arg来抑制完整的垃圾收集 -XX:+DisableExplicitGC
  2. 保留完整的GC,但是使用JVM arg遵从CMS收集器 -XX:+ExplicitGCInvokesConcurrent
  3. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>
  4. 禁用侦听器

信贷到期的信贷; 我从这里得到了我的初步答案.

  • 一定要喜欢Tomcat Bugzilla条目中关于此问题的评论:_"默认情况下,大约每2.9亿年就会出现一个完整的GC."_ :) (3认同)