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

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可以在一段时间内分发,这样就不会有两台服

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

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

还有人见过这种行为吗?是否有任何方法可以影响这些“常规”完整GC发生的时间?

您的“常规”每小时GCs可能是由于“当gcDaemonProtection=true时,JreMemoryLeakPreventionListener每小时导致一次完整GC”

确认您的Tomcat版本和
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。”:)