2014-10-31 32 views
1

我在使用Tomcat的内存消耗方面存在问题。 刚开始后没有任何反应,但如果某些用户登录,在此之后内存使用开始在Edem中增长。 PermGen不增长,但无论如何,它是正常的。 jvisualvm profilingTomcat的内存使用量在IDLE中增长

我的分析显示线程RMI TCP连接产生大量Object [] char []和String []对象。我不明白什么是错的,在哪里挖。谁启动这个线程,是postgres连接,这是什么?

回答

2

你正在观察你正在观察:

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

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

我也看不出有什么形象示人的问题。伊甸园基本上总是增长缓慢,因为总会有一些消耗内存的工作。

一旦收集到Eden(~200MB左右),你会发现大部分内存都是完全免费的,而且在幸存者空间中很少(〜8MB)结束,因为可能还有对这些对象的引用。但他们似乎并没有离开幸存者,因为OldGen没有增长,底部的柱状图也显示出典型的幸存者物体达到2级并且消失。

这一切对我来说都很正常。

+0

多数民众赞成这是正确的,但服务器什么也不做,没有人连接到它,并在生产它周期性失败。 – ekitru 2014-10-31 13:02:16

+1

监视更长时间,您显示的图像完全正常。如果有内存泄漏,您会看到OldGen(和/或可能是PermGen)随着时间的推移而增长。一旦OldGen已满并且垃圾收集功能不够用,JVM就会出错。另请参阅http://stackoverflow.com/questions/542979/using-heapdumponoutofmemoryerror-parameter-for-heap-dump-for-jboss了解应该包含实际问题的heapdump。即使您的服务器处于空闲状态:JVM也具有管理任务,如无论如何都会运行的垃圾回收线程,因此总是存在一点活动。 – zapl 2014-10-31 13:18:07

+0

我发现PermGen OOM生产异常,很棒。 =( – ekitru 2014-10-31 13:54:42

3

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

+0

我同意,但伊甸园的增长相当快而对生产tomcat的任何活动+本地电脑开始出现故障 – ekitru 2014-10-31 13:03:17

+0

你是什么意思的生产无法启动/定期失败了呢?这似乎是一个不同的问题,除非你得到的OutOfMemoryError或JVM被卡住试图做GC后GC。 – 2014-10-31 13:12:37

+0

其实我不明白OOM异常,但对生​​产,不时的tomcat开始使用99%的CPU负载,而不是responsing了。 – ekitru 2014-10-31 13:16:35