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

标签 java performance tomcat heap-memory visualvm

我使用 startup.bat 启动 tomcat,不再使用它。据我所知,这是一个普通的普通安装(版本 7.0.47)。当使用 JMX 工具(如 VisualVM)连接时,我看到堆空间的使用量不断增加。直到发生一些垃圾收集。然后一切从头再来。

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

我的理解对吗,它不断生成新的对象?

enter image description here

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

enter image description here

正如“每线程分配” View 所示,它与 RMI 有关,因为在这里可以看到最大的增加。

enter image description here

最佳答案

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

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

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

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


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

关于java - 为什么tomcat在空闲期间使用越来越多的堆空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27034905/

相关文章:

c# - 为希望在 JSP+Tomcat 中构建的 ASP.NET/C# 开发人员预订推荐信?

java - 缓冲阅读器只读取文本文件中的第一行?

java - spring data cassandra 默认限制 10

.net - WPF 中 UI 虚拟化的资源和指南

python - 我的 Python 程序很慢!我怎样才能加快速度?难道我做错了什么?

java - 有没有办法确定 OOPS 在 jvm 进程中占用的大小

tomcat - Grails 2.5.0 在部署到 tomcat 时不使用我的 lib/jars

java.io.IOException : Server returns HTTP response code 505

java - OpenGL 旋转和物体移动

java - JSP - 只能导入一个类型。 Name.pacakge.class 解析为一个包,但类在那里