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

Ang*_*nes 6 java heap performance tomcat visualvm

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

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

我的理解是否正确,它会不断产生新的物体?

在此输入图像描述

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

在此输入图像描述

正如"每线程分配"视图所示,它与RMI有关,因为这里可以看到最大的增长.

在此输入图像描述

har*_*ldK 5

简短的回答:不要担心,这是完全正常的.:-)

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

如果您有兴趣,请在Oracles Java教程页面上阅读有关Java垃圾收集的更多信息.

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


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