2011-06-13 219 views
0

我们使用了eclipse内存分析器,它在堆中显示以下内容。堆快照已附加。这会导致未来的内存泄漏吗?Java EE应用程序堆问题

我无法确定哪个文件正好导致如此多的对象被保留在堆上。你能提供一些关于这方面的见解吗?我们在Spring框架和tomcat 5.5服务器上使用Java EE应用程序。使用的数据库是mysql。

在此先感谢。

The heap snapshot

enter image description here

+0

问题是什么?什么让你担心? – bmargulies 2011-06-13 12:33:58

+0

有很多对象保留在堆上。这是否会导致内存不足异常?它似乎发生过一次。我想要找到根本原因... – 2011-06-13 12:42:26

回答

2

堆栈看起来并不特别令人担忧,如果你问我。

显示的条目由Spring框架创建并用于提高其性能。由于Spring和许多其他现代Java框架一样,使用反射来耦合bean,注入东西,应用配置等,所以如果所有的spring bean都被一遍又一遍地检查,它会有点慢。 Spring为此缓存了这个检查的结果。

另请注意,正在使用WeakHashMap,它具有与垃圾收集有关的特殊属性(请阅读其Javadoc以了解更多信息)。

+0

问题是eclipse内存分析器显示3个可能的泄漏嫌疑人已保留大约3.5 mb的堆每个。这可能表明可能的内存泄漏? – 2011-06-13 12:47:39

+1

MAT是否已经指出特定部分可能泄漏?我仍然不会担心一些10MB的内存使用量,但是模拟一些负载(例如通过JMeter),让它运行一段时间并再次检查这个特定的部分。由于您的应用程序中的bean数量有限,因此我希望内省的结果也是有限的。 – 2011-06-13 12:52:10

+0

我已经添加了内存分析器的另一个快照,显示泄露嫌疑人?如此多的堆空间被占用是否正常? – 2011-06-13 13:07:06

1

查找是否真的有内存泄漏的最好方法是在各个级别上昏迷它: 1.在应用程序启动并且没有提供任何请求后,获取堆内存快照。 2.在提供请求时使用各种级别的快照(正在使用应用程序快照) 3.处理完所有请求后,在3-4分钟后拍摄快照。

如果没有内存泄漏1和3快照应该大致相同。

如果他们不是,你可以看到哪些额外的对象占用内存。从您的定制软件包开始跟踪,而不是Spring或JDBC或核心库软件包。

+0

这是我可以尝试做的事情。谢谢 – 2011-06-14 06:01:14