Java 为什么这些Tomcat服务器的JVM每小时执行一次完整的GC?
我们运行了许多Tomcat服务器,并观察到完全垃圾收集(GC)通常每小时执行一次,特别是在内存使用率相对较低的情况下。精确时间似乎与应用服务器启动的时间有关;如果服务器在01:13启动,则完整GC将在02:13完成,下一个完整GC将在03:13发生。我还没有找到任何文档来解释这种行为 这是一个问题,因为同时启动的服务器池几乎都会在同一时间执行完整的GCs。如果GC延迟足够长,导致负载平衡器将服务器标记为关闭,则整个应用程序可能会脱机一段时间。如果完整的GC可以在一段时间内分发,这样就不会有两台服务器同时执行完整的GC,这会更好,但是我找不到任何方法来控制这种行为 还有人见过这种行为吗?是否有任何方法可以影响这些“常规”完整GC发生的时间?您的“常规”每小时GCs可能是由于“当gcDaemonProtection=true时,JreMemoryLeakPreventionListener每小时导致一次完整GC” 确认您的Tomcat版本和Java 为什么这些Tomcat服务器的JVM每小时执行一次完整的GC?,java,tomcat,garbage-collection,jvm,Java,Tomcat,Garbage Collection,Jvm,我们运行了许多Tomcat服务器,并观察到完全垃圾收集(GC)通常每小时执行一次,特别是在内存使用率相对较低的情况下。精确时间似乎与应用服务器启动的时间有关;如果服务器在01:13启动,则完整GC将在02:13完成,下一个完整GC将在03:13发生。我还没有找到任何文档来解释这种行为 这是一个问题,因为同时启动的服务器池几乎都会在同一时间执行完整的GCs。如果GC延迟足够长,导致负载平衡器将服务器标记为关闭,则整个应用程序可能会脱机一段时间。如果完整的GC可以在一段时间内分发,这样就不会有两台服
JreMemoryLeakPreventionListener的gcDaemonProtection
属性的值(默认值为true
)
据称,该补丁包含在Tomcat v.7.0.28+和v.6.0.36+中
升级服务器,或从中选择非升级解决方案,总结如下:
使用JVM arg-XX:+DisableExplicitGC
保留完整的GCs,但使用JVM arg遵从CMS收集器
-XX:+explicitgchinvokesconcurrent
设置
禁用侦听器
信用到期时的信用;我从中获得了初始答案。您应该可以通过
-Dsun.rmi.dgc.client.gcInterval=60000
-Dsun.rmi.dgc.server.gcInterval=60000
看看这里
您是否有一个按时间表运行的进程(通过Quartz等)可能会定期填满堆?请告诉我。。。在这里,除非Tomcat或其中的一个Web应用程序正在进行RMI,否则我看不出这有什么区别。答案中的链接已经失效。Wayback archive:我很喜欢Tomcat Bugzilla条目中关于这个问题的评论:“默认情况下,现在大约每2.9亿年就会发生一次完整的GC。”:)