我们运行许多Tomcat服务器并且观察到完全垃圾收集(GCs)通常每小时执行一次,特别是当内存使用率相对较低时。精确时间似乎与应用程序服务器启动的时间有关;如果服务器在01:13启动,则完整GC在02:13完成,下一个完整GC将在03:13完成。我无法找到任何文档来解释这种行为。
这是一个问题,因为同时启动的服务器池都会在大约同一时间完成所有GC。如果GC延迟足够长,导致负载均衡器将服务器标记为关闭,则整个应用程序可能会脱机一段时间。如果完整的GC可以在一段时间内分配,那么没有两台服务器同时进行完整的GC会更好,但我找不到任何方法来控制这种行为。
还有其他人看过这种行为吗?有没有办法影响这些“常规”完整的GC何时发生?
答案 0 :(得分:25)
您的“常规”每小时GC可能是由于this known bug,“当gcDaemonProtection = true 时,JreMemoryLeakPreventionListener会每小时生成一个完整的GC。”
确认您的Tomcat版本以及gcDaemonProtection
的{{1}}属性的值(默认为JreMemoryLeakPreventionListener
)。
该补丁据称包含在Tomcat v.7.0.28 +和v.6.0.36 +中。
升级您的服务器,或从here中选择一个非升级解决方案,摘要如下:
true
-XX:+DisableExplicitGC
-XX:+ExplicitGCInvokesConcurrent
信用到期的信用;我从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