我们运行许多 Tomcat 服务器,并观察到完整的垃圾收集 (GC) 通常每小时执行一次,特别是当内存使用率相对较低时。精确时间似乎与应用程序服务器启动的时间有关;如果服务器在 01:13 启动,则在 02:13 完成一次 Full GC,下一次 Full GC 将在 03:13 发生。我无法找到任何文档来解释这种行为。
这是一个问题,因为同时启动的服务器池往往会在大约同一时间执行完整的 GC。如果 GC 延迟足够长,导致负载均衡器将服务器标记为关闭,则整个应用程序可能会离线一段时间。如果完整的 GC 可以分布在一个时期内,这样就没有两个服务器同时执行完整的 GC,那就更好了,但我找不到任何方法来控制这种行为。
还有其他人看到过这种行为吗?有什么方法可以影响这些“常规”完整 GC 的发生时间吗?
您每小时“定期”的 GC 可能是由于这个已知的错误 https://issues.apache.org/bugzilla/show_bug.cgi?id=53267, "当 gcDaemonProtection=true 时,JreMemoryLeakPreventionListener 每小时导致一次完整 GC".
确认您的 Tomcat 版本和值gcDaemonProtection
你的财产JreMemoryLeakPreventionListener
(默认为true
).
据称该补丁包含在 Tomcat v.7.0.28+ 和 v.6.0.36+ 中。
升级您的服务器,或选择非升级解决方案here http://mail-archives.apache.org/mod_mbox/tomcat-users/201008.mbox/%3CAANLkTino=BjP5LsBCwncB2HvNDzyKLr5y-8yWdt15a89@mail.gmail.com%3E,总结为:
- 使用 JVM arg 抑制完全垃圾收集
-XX:+DisableExplicitGC
- 保留完整的 GC,但使用 JVM arg 遵循 CMS 收集器
-XX:+ExplicitGCInvokesConcurrent
- set
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
gcDaemonProtection="false"/>
- 禁用监听器
信用到期时信用;我的初步答案来自here https://stackoverflow.com/questions/8916002/tomcat-garbage-collecting-frequency/14601304#14601304.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)