我有一个结合了Spring + Hibernate的webapp。我在Tomcat服务器本地部署它,我得到大约150-200 Mb的内存消耗,据我所知,这并不是那么高。但显然在生产部署中,它在WebSphere上工作,我获得了500Mb的内存使用率和非常高的垃圾收集频率。
起初我把Hibernate归咎于问题(如this other question所示),但现在我很遗憾可能导致这种明显的高使用率。
我尝试使用MAT分析我的应用程序,这些是我的直方图结果:
我在分析记忆方面没有太多经验,大多数时候我觉得好像我在失败后看着汽车的引擎,但在我看来,char []引用与spring的内部有关“数据库“的豆子。我为spring的mvc组件和事务使用基于注释的配置:
<tx:annotation-driven />
<context:annotation-config />
您是否发现这些值中的任何一个都非常高?你能帮我解决一下这个问题吗?
PS。这是我更接近完整堆的堆转储的支配者
答案 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(即在控制器方法结束后)。
现在的问题是,如何减少这种内存使用量?