我有一个结合了 Spring + Hibernate 的 Web 应用程序。我将其部署在 Tomcat 服务器本地,内存消耗约为 150-200 Mb,据我所知,这根本没有那么高。但显然在通过 WebSphere 运行的生产部署中,我获得了 500Mb 的内存使用量,并且垃圾收集的频率非常高。
起初我将此问题归咎于 Hibernate(如 this other question 中所示),但现在我不知道是什么导致了这种明显的高使用率。
我尝试使用 MAT 分析我的应用程序,这些是我的直方图结果:
我在分析内存方面没有太多经验,大多数时候我感觉好像是在故障后查看汽车的引擎,但在我看来, char[] 引用与 spring 的内部“有关” bean 类数据库”。我对 spring 的 mvc 组件和事务使用基于注释的配置:
<tx:annotation-driven />
<context:annotation-config />
您是否发现这些值中的任何一个值特别高?你能帮我追踪问题吗?
PS。这是我对接近完整堆的堆转储的支配最佳答案
您的两个问题(通常)都是正常的。
运行的垃圾收集器通常表明您正在进行大量处理,尤其是创建大量对象的处理(例如 jdbc)。除非您的服务器在垃圾收集期间变得无响应,否则无需担心。如果垃圾回收后没有返回到基线内存(锯齿形内存图的底部),则可能存在泄漏。
高内存使用率也是正常的,特别是如果您为生产 JVM 提供的内存多于本地 JVM 的内存。在尝试比较性能结果之前,比较您的启动参数并确保它们相同。
[我知道这并不是一个真正的答案,但它太长了,无法容纳评论]
关于java - Spring内存使用率过高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21523266/