为什么tomcat在空闲期间使用越来越多的堆空间?

时间:2014-11-20 08:27:38

标签: java performance tomcat heap visualvm

我使用startup.bat启动tomcat,并且不再使用它。据我所知,这是一个普通的香草装置(版本7.0.47)。当使用像VisualVM这样的JMX工具连接时,我看到堆空间的使用不断增加。直到一些垃圾收集发生。然后它再次开始。

为什么会这样? tomcat在那做什么?

我的理解是否正确,它会不断生成新的对象?

enter image description here

正如@Thilo所建议的那样,我拍摄了堆直方图的快照。它似乎主要创建对象阵列,字符和字节。下图显示了相隔3分钟拍摄的两张快照之间的差异。

enter image description here

作为"每线程分配"视图表明,它与RMI有关,因为这里可以看到最多的增长。

enter image description here

1 个答案:

答案 0 :(得分:5)

简短回答:别担心,这是完全正常的。 : - )

正如@Gimby建议的那样,长*答案是Tomcat(像大多数服务器一样)有多个线程一直在运行,以监视资源和健康检查等事情。这些线程每隔一段时间唤醒并创建一个很多短命的物体。 GC(垃圾收集器)不会立即收集这些对象。分析应用程序将看到堆连续增加一个固定间隔,或者直到达到阈值然后突然下降。 GC开始下降,在一次扫描中收集所有短寿命物体。这将导致您看到的“锯齿”图案。再次,这是完全正常的。

如果您有兴趣,请在Oracles Java教程页面上阅读有关Java garbage collection的更多信息。

唯一需要注意的是,锯齿图案的峰值越来越高,或者每个峰值之间的持续时间变短。此可能表示应用程序中的资源/引用泄漏。但在大多数情况下,只是你的应用程序使用更多内存,因为它实际上是在做事情。


*)我确信有人可以提供比这更长,更深入的答案,但这更适合博客或技术文章。 ; - )