Tomcat 内存使用量在 IDLE 中增长

Posted

技术标签:

【中文标题】Tomcat 内存使用量在 IDLE 中增长【英文标题】:Tomcat memory usage grows in IDLE 【发布时间】:2014-12-27 18:49:03 【问题描述】:

我对 Tomcat 上的内存消耗增加有疑问。 刚开始没有任何反应,但如果一些用户登录,在此内存使用量开始在 Edem 中增长之后。 PermGen 不会增长,但无论如何,它是不正常的。

我的分析表明线程 RMI TCP Connection 产生了很多 Object[] char[] 和 String[] 对象。我不明白出了什么问题以及在哪里挖。谁启动了这个线程,是 postgres 连接,这是什么?

【问题讨论】:

【参考方案1】:

这是正常的,不是内存泄漏。用于管理应用程序的线程不断地创建和销毁对象。您会看到内存增加,因为 JVM 垃圾收集器没有急切地回收未使用的内存。这会定期发生(基于以前的统计数据)或内存不足时发生。如果它是真正的内存泄漏,您将不会看到 Eden 内存使用量在收集后下降到几乎为零。内存泄漏显示为随时间增加的最低点(GC 之后)。

【讨论】:

我同意,但 eden 在本地 PC 上增长很快,没有任何活动 + 生产 tomcat 开始失败 生产无法启动/周期性失败是什么意思?这似乎是一个不同的问题,除非您遇到 OutOfMemoryError 或者 JVM 在 GC 之后尝试执行 GC 时卡住了。 其实我没有得到OOM异常,但是在生产中,tomcat时不时开始使用99%的cpu负载并且不再响应了。 当您的生产 Tomcat 停止响应时,您应该进行线程转储并检查它。根据您使用的 JVM,您还将获得内存使用情况,这可能让您排除内存泄漏。 我刚刚卡在服务器上并从中获取了 heapdump。 BUt 没有有用的信息 =( 最大的一个:char[] 和 String[]【参考方案2】:

你在观察你在观察:

JVM 收集有关其自身的统计信息并将其发送给您。这会消耗内存并使用 RMI 传输工具。

What is RMI TCP Accept, Attach Listener, and Signal Dispatcher in Visual VM?

我也没有看到该图像显示的问题。伊甸园基本上总是在缓慢增长,因为总是有一些工作会消耗内存。

一旦 Eden 被收集(接近尾声的价值约为 200MB),您可以看到大部分内存是完全空闲的,并且很少 (~8MB) 以幸存者空间结束,因为可能仍然存在对这些对象的引用。但他们似乎并没有离开幸存者,因为 OldGen 没有增长,底部的直方图也显示典型的幸存者对象达到 2 级然后就消失了。

这一切在我看来都很正常。

【讨论】:

没错,但是服务器什么都不做,没有人连接到它,并且在生产中它会定期失败。 监控时间越长,您显示的图像完全正常。如果存在内存泄漏,您将看到 OldGen(和/或 PermGen)随着时间的推移而增长。一旦 OldGen 已满且垃圾收集无法充分释放,JVM 就会出错。另请参阅***.com/questions/542979/… 以获取应该包含实际问题的堆转储。即使您的服务器处于空闲状态:JVM 也有管理任务,例如垃圾收集线程,无论如何都会运行,因此总是存在一些活动。 我在生产中发现了 PermGen OOM 异常,太好了。 =( 可能***.com/a/10248938/995891 否则frankkieviet.blogspot.ca/2006/10/… 谢谢,好文章!我认为这不是类加载器内存泄漏,因为我们已经尝试过不重新部署,而是使用停止/启动重新启动 tomcat。 Heap 显示 70 mb 的 HashMap 和 HashMap 的数组在哪里。

以上是关于Tomcat 内存使用量在 IDLE 中增长的主要内容,如果未能解决你的问题,请参考以下文章

Dask Worker 进程内存不断增长

如何在 iOS 中跟踪负责堆增长的代码

Tomcat内存越来越大

ES启动内存大小设置

在生产系统上详细分析 Tomcat 堆

什么是 ray::IDLE,为什么有些工作人员内存不足?