Spring的内存使用率过高

时间:2014-02-03 09:06:37

标签: java spring hibernate spring-mvc memory-leaks

我有一个结合了Spring + Hibernate的webapp。我在Tomcat服务器本地部署它,我得到大约150-200 Mb的内存消耗,据我所知,这并不是那么高。但显然在生产部署中,它在WebSphere上工作,我获得了500Mb的内存使用率和非常高的垃圾收集频率。

起初我把Hibernate归咎于问题(如this other question所示),但现在我很遗憾可能导致这种明显的高使用率。

我尝试使用MAT分析我的应用程序,这些是我的直方图结果:

Histogram Dominator tree

我在分析记忆方面没有太多经验,大多数时候我觉得好像我在失败后看着汽车的引擎,但在我看来,char []引用与spring的内部有关“数据库“的豆子。我为spring的mvc组件和事务使用基于注释的配置:

<tx:annotation-driven />
<context:annotation-config />

您是否发现这些值中的任何一个都非常高?你能帮我解决一下这个问题吗?

PS。这是我更接近完整堆的堆转储的支配者 enter image description here

3 个答案:

答案 0 :(得分:2)

你的问题都是(通常)正常。

垃圾收集器运行通常表明您正在进行大量处理,尤其是创建大量对象的类型(如jdbc)。除非您的服务器在垃圾回收期间无响应,否则无需担心。如果在垃圾回收后它没有返回到基线内存(锯齿内存图的底部),则可能会发生泄漏。

高内存使用率也是正常的,特别是如果您为生产JVM提供的内存多于本地JVM。比较您的启动参数,并确保它们在尝试比较其性能结果之前是相同的。

[我知道这不是一个真正的答案,但是它太长了,不适合评论]

答案 1 :(得分:1)

您确实意识到(除非您使用Liberty Profile)与Tomcat相比,WebSphere将大量额外的jar文件堆积到类路径中?因此,在WebSphere下绝对可以预期更大的内存占用。

过多的垃圾收集意味着您没有为应用程序JVM分配足够的内存。给它更多(例如2 gig)并通过JConsole或类似工具观察运行时内存使用情况图。观察在更轻松的垃圾收集之前它所达到的内存消耗,并使用它来了解JVM确实需要多少。

请注意,如果在每次垃圾回收后,图表都没有返回到安全基线,而只是部分减少,那么您可能会发生内存泄漏。

答案 2 :(得分:0)

我发现每个渲染页面的内存消耗都很高,并且已经将问题精确定位到Apache Tiles。如果我使用Tiles,每个页面加载会使堆的内存占用量高达30 MB,这确实感觉很多。禁用它几乎不会导致内存消耗。

调试控制器方法表明,在方法本身内几乎没有内存消耗,但它是在30mb内存使用率触发时将控制返回到viewresolver(即在控制器方法结束后)。

现在的问题是,如何减少这种内存使用量?