我使用 startup.bat 启动 tomcat,不再使用它。据我所知,这是一个普通的普通安装(版本 7.0.47)。当使用 JMX 工具(如 VisualVM)连接时,我看到堆空间的使用量不断增加。直到发生一些垃圾收集。然后一切从头再来。
为什么会这样? tomcat在那里做什么?
我的理解对吗,它不断生成新的对象?
正如@Thilo 所建议的,我拍摄了堆直方图的快照。它似乎主要创建对象数组、字符数组和字节数组。下图显示了相隔 3 分钟拍摄的两张快照之间的差异。
正如“每线程分配” View 所示,它与 RMI 有关,因为在这里可以看到最大的增加。
最佳答案
简短的回答:别担心,这是完全正常的。 :-)
长*答案,正如@Gimby 所建议的,是 Tomcat(像大多数服务器一样)有多个线程一直在运行,以监控资源和健康检查等事情。这些线程每隔一段时间唤醒并创建一个很多短暂的对象。 GC(垃圾收集器)不会立即收集这些对象。分析应用程序将看到堆在固定时间间隔内不断增加,或者直到达到阈值然后突然下降。下降是由 GC 启动引起的,一次扫描收集了所有短暂的对象。这将导致您看到“锯齿”图案。同样,这是完全正常的。
如果您有兴趣,请阅读有关 Java garbage collection 的更多信息在 Oracles Java 教程页面。
唯一需要注意的是,锯齿图案的峰值变得越来越高,或者每个峰值之间的持续时间变得越来越短。这可能 表示应用程序中存在资源/引用泄漏。但在大多数情况下,这只是您的应用程序使用了更多内存,因为它确实在做一些事情。
*) 我相信有人可以提供比这更长、更深入的答案,但这更适合博客或技术文章。 ;-)
关于java - 为什么tomcat在空闲期间使用越来越多的堆空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27034905/