我正在做一个大型的ERP项目,它有大约2100个表的数据库模型。使用Hibernate映射的“仅”500个表,部署在web服务器上的应用程序占用大约3GB的工作内存。
在一个持久化单元中使用这么多表时,有什么方法可以减少Hibernate的元模型内存占用吗?或者我应该放弃Or,转而使用普通的老JDBC (甚至jOOQ)?
现在,我使用Hibernate 4.1.8,Spring3.1.3,JBoss作为7.1,并使用MSSQL数据库。
编辑:
JavaMelody内存直方图输出 -使用2000年生成的测试表,与原始db模型相比,测试表的范围要小一些(因此“只”使用了1.3GB的内存)
编辑2:
Java MAT堆分析:
发布于 2015-06-04 08:55:34
我也遇到了同样的问题,我成功地将内存消耗从xGB减少到30M,buildSessionFactory从2分钟传递到7秒。
解决方案的一个重要部分张贴在这里。
发布于 2012-12-06 01:53:51
开放的hibernate会话在使用时往往会累积对象。这不是内存泄漏;hibernate会话设计为用于请求一次,它缓存持久的对象(即驻留在会话中)以及查询和其他数据。如果调用session.toString(),您将看到会话中存在的对象的洗衣列表。
如果您使用大量的对象,请考虑分批处理这些对象。您可以在每个批处理之后调用session.clear(),从会话中删除缓存的数据和持久对象,并减少会话的内存占用(有时会显着地减少内存占用)。
在调用session.clear()之后,请注意在此调用之前加载的对象将恢复到分离状态,并且对于当前会话不再是活动的。
您还可以使用延迟获取来优化hibernate为了处理给定操作而必须加载的数据量。您可以在hibernate文档中了解更多这方面的内容。我建议启用hibernate的SQL日志功能,并检查hibernate是否正在撤回它不需要的数据。
还可以配置hibernate来收集可以帮助您的统计信息:
sessionFactory.getStatistics().setStatisticsEnabled(true);发布于 2012-11-26 14:54:25
我建议使用爪哇旋律对生产或暂存中的应用程序进行分析,以确定在何处或谁在消耗最大内存,并根据分析结果确定应用程序中应该做哪些更改。
Java旋律非常容易集成和配置,在生产中只需更新web.xml就可以启用或禁用
https://stackoverflow.com/questions/13567217
复制相似问题