首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大量表和Hibernate内存消耗

大量表和Hibernate内存消耗
EN

Stack Overflow用户
提问于 2012-11-26 14:47:48
回答 4查看 4.7K关注 0票数 12

我正在做一个大型的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堆分析:

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-04 08:55:34

我也遇到了同样的问题,我成功地将内存消耗从xGB减少到30M,buildSessionFactory从2分钟传递到7秒。

解决方案的一个重要部分张贴在这里。

postInstantiate buildSessionFactory慢速/内存巨大数据库

票数 2
EN

Stack Overflow用户

发布于 2012-12-06 01:53:51

开放的hibernate会话在使用时往往会累积对象。这不是内存泄漏;hibernate会话设计为用于请求一次,它缓存持久的对象(即驻留在会话中)以及查询和其他数据。如果调用session.toString(),您将看到会话中存在的对象的洗衣列表。

如果您使用大量的对象,请考虑分批处理这些对象。您可以在每个批处理之后调用session.clear(),从会话中删除缓存的数据和持久对象,并减少会话的内存占用(有时会显着地减少内存占用)。

在调用session.clear()之后,请注意在此调用之前加载的对象将恢复到分离状态,并且对于当前会话不再是活动的。

您还可以使用延迟获取来优化hibernate为了处理给定操作而必须加载的数据量。您可以在hibernate文档中了解更多这方面的内容。我建议启用hibernate的SQL日志功能,并检查hibernate是否正在撤回它不需要的数据。

还可以配置hibernate来收集可以帮助您的统计信息:

代码语言:javascript
复制
sessionFactory.getStatistics().setStatisticsEnabled(true);
票数 5
EN

Stack Overflow用户

发布于 2012-11-26 14:54:25

我建议使用爪哇旋律对生产或暂存中的应用程序进行分析,以确定在何处或谁在消耗最大内存,并根据分析结果确定应用程序中应该做哪些更改。

Java旋律非常容易集成和配置,在生产中只需更新web.xml就可以启用或禁用

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13567217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档