29

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

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

有没有其他人看到过这种行为?有什么方法可以影响这些“常规”完整 GC 何时发生?

4

2 回答 2

25

您的“常规”每小时 GC 可能是由于这个已知的错误,“当 gcDaemonProtection=true 时,JreMemoryLeakPreventionListener 每小时会导致一次完整的 GC ”。

确认您的 Tomcat 版本和您的gcDaemonProtection属性的值JreMemoryLeakPreventionListener(默认为true)。

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

升级您的服务器,或从此处选择非升级解决方案,总结如下:

  1. 使用 JVM arg 抑制完整的垃圾回收-XX:+DisableExplicitGC
  2. 保留完整的 GC,但使用 JVM arg 服从 CMS 收集器 -XX:+ExplicitGCInvokesConcurrent
  3. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>
  4. 禁用监听器

信用到期的信用;我从这里得到了我的初步答案。

于 2013-02-15T20:42:17.470 回答
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

于 2013-02-15T20:48:15.300 回答