【发布时间】:2014-02-26 16:44:24
【问题描述】:
我有一个结合了 Spring + Hibernate 的 webapp。我将它本地部署在 Tomcat 服务器中,我得到大约 150-200 Mb 的内存消耗,据我所知,这根本不是那么高。但显然在 WebSphere 上运行的生产部署中,我得到了 500Mb 的内存使用量和非常高的垃圾收集频率。
起初我将问题归咎于 Hibernate(如 this other question 中所见),但现在我不知道是什么导致了这种明显的高使用率。
我尝试使用 MAT 分析我的应用,这些是我的直方图结果:
我在分析内存方面没有太多经验,而且大多数时候我感觉好像我在看汽车的引擎发生故障后,但在我看来,char[] 引用与 spring 的内部“ bean 的数据库”。我对 spring 的 mvc 组件和事务使用基于注释的配置:
<tx:annotation-driven />
<context:annotation-config />
您是否发现其中任何一个值非常高?你能帮我追查问题吗?
PS。这是我的堆转储接近满堆的支配者
【问题讨论】:
-
这些数字对我来说并不太高,例如如果 4.5 MB 保留堆占整个堆的 18.41%,则您只使用 25 MB 堆。这在我看来并不多。您确定您分析了正确的转储吗?您应该在堆快满时(或在 OutOfMemoryError 上)创建一个并分析它。
-
(a) 这不是编程问题。 (b) 除非您的生产环境与您的本地环境完全相同,否则您不应期望内存使用情况相同。你真的看到问题了吗?垃圾回收是正常现象,并不表示内存泄漏。
-
@TedBigham 这是很正常的事情,但如果发生得太频繁就不会了。也许内存泄漏不是正确的称呼方式,也许我应该说“高内存消耗”
-
@kelmer,内存泄漏是永远不会被垃圾回收的内存。所以垃圾收集器运行很多,几乎与内存泄漏完全相反。
-
@Thomas 我发布了另一张图片,其中有一棵靠近满堆的垃圾场支配树
标签: java spring hibernate spring-mvc memory-leaks