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

时间:2013-02-15 20:36:13

标签: java tomcat garbage-collection jvm

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

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

还有其他人看过这种行为吗?有没有办法影响这些“常规”完整的GC何时发生?

2 个答案:

答案 0 :(得分:25)

您的“常规”每小时GC可能是由于this known bug,“当gcDaemonProtection = true 时,JreMemoryLeakPreventionListener会每小时生成一个完整的GC。”

确认您的Tomcat版本以及gcDaemonProtection的{​​{1}}属性的值(默认为JreMemoryLeakPreventionListener)。

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

升级您的服务器,或从here中选择一个非升级解决方案,摘要如下:

  1. 使用JVM arg true
  2. 禁止完整垃圾回收
  3. 保留完整的GC,但是使用JVM arg推迟到CMS收集器 -XX:+DisableExplicitGC
  4. 设置-XX:+ExplicitGCInvokesConcurrent
  5. 禁用侦听器
  6. 信用到期的信用;我从here获得了我的初步答案。

答案 1 :(得分:3)

您应该可以通过

更改间隔
-Dsun.rmi.dgc.client.gcInterval=60000
-Dsun.rmi.dgc.server.gcInterval=60000

看看这里 https://docs.oracle.com/cd/E19199-01/817-2180-10/pt_chap5.html