Ved*_*ran 12 java memory spring hibernate jpa
我正在开发一个大型ERP项目,该项目拥有大约2100个表的数据库模型.使用Hibernate映射的"仅"500个表,部署在Web服务器上的应用程序需要大约3GB的工作内存.
在一个持久性单元中使用那么多表时,有没有办法减少Hibernate的元模型内存占用?或者我应该放弃ORM并使用普通的旧JDBC(甚至是jOOQ)?
现在我正在使用Hibernate 4.1.8,Spring 3.1.3,JBoss AS 7.1并使用MSSQL数据库.
编辑:
JavaMelody内存直方图输出 - 使用2000个生成的测试表,这些测试表的范围比原始数据库模型小一点(因此'仅花费了1.3GB的内存)
编辑2:
Java MAT堆分析:
我建议使用java melody对生产或暂存中的应用程序进行分析,以找出何处或谁消耗了最大内存,并根据分析结果决定应在应用程序中进行哪些更改。
Java melody 非常容易集成和配置,在生产中您只需更新 web.xml 即可启用或禁用
打开的hibernate会话会在使用时产生对象.这不是内存泄漏; 一个hibernate会话被设计为一次用于请求,它缓存持久的对象(即在会话中存在),以及查询和其他数据.如果您打电话session.toString(),您将看到会话中的对象清单.
如果使用大量对象,请考虑批量处理对象.您可以session.clear()在每个批处理后调用以从会话中逐出缓存数据和持久对象,并减少会话的内存占用(有时会非常显着).
调用之后session.clear(),请注意在此调用之前加载的对象将恢复为分离状态,并且不再对当前会话处于活动状态.
您还可以使用延迟提取来优化hibernate必须加载的数据量,以便处理给定的操作.您可以在hibernate文档中阅读更多相关信息.我建议启用hibernate的SQL日志记录功能,并检查hibernate是否正在撤回它不需要的数据.
您还可以配置hibernate以收集可以帮助您的统计信息:
sessionFactory.getStatistics().setStatisticsEnabled(true);
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,我成功地将内存消耗从 xGB 减少到 30M,buildSessionFactory 从 2 分钟减少到 7 秒。
解决方案的重要部分发布在这里
postInstantiate buildSessionFactory慢/内存巨大数据库