【问题标题】:Large number of tables and Hibernate memory consumption大量表和 Hibernate 内存消耗
【发布时间】:2012-11-14 01:40:15
【问题描述】:

我正在处理一个大型 ERP 项目,该项目具有包含大约 2100 个表的数据库模型。使用 Hibernate 映射的“仅”500 个表,部署在 Web 服务器上的应用程序需要大约 3GB 的工作内存。

在一个持久性单元中使用这么多表时,有什么方法可以减少 Hibernate 的元模型内存占用?或者我应该放弃 ORM 并使用普通的旧 JDBC(甚至jOOQ)?

现在我正在使用 Hibernate 4.1.8、Spring 3.1.3、JBoss AS 7.1 并使用 MSSQL 数据库。

编辑:

JavaMelody memory histogram output - 生成了 2000 个测试表,这些测试表的范围比原始数据库模型小一些(因此“仅”消耗了 1.3GB 内存)

编辑 2:

Java MAT 堆分析:

【问题讨论】:

  • 你知道休眠消耗了多少3GB吗?
  • 考虑到大约 10 个表的内存消耗小于 256MB,我估计它在 2.74 GB 以北 :)
  • 您想试试 Batoo JPA。 batoo.jp

标签: java spring hibernate jpa memory


【解决方案1】:

打开的休眠会话将倾向于在使用时累积对象。这不是内存泄漏;休眠会话被设计为一次请求使用,它缓存持久化的对象(即存在于会话中),以及查询和其他数据。如果您调用session.toString(),您将看到会话中存在的对象的洗衣清单。

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

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

您还可以使用 延迟获取 来优化 hibernate 为处理给定操作而必须加载的数据量。您可以在 hibernate 文档中阅读更多相关信息。我建议启用 hibernate 的 SQL 日志记录功能,并检查 hibernate 是否正在拉回它不需要的数据。

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

sessionFactory.getStatistics().setStatisticsEnabled(true);

【讨论】:

    【解决方案2】:

    我建议使用java melody 对生产或暂存的应用程序进行分析,以找出消耗最大内存的位置或对象,并根据分析结果决定应在应用程序中进行哪些更改。

    Java melody 非常易于集成和配置,在生产环境中,您只需更新 web.xml 即可启用或禁用

    【讨论】:

    • 打算尝试这样做并在明天用结果更新问题,感谢您的建议。
    • 添加了来自 JavaMelody 的内存直方图。
    • 无法从直方图中看出很多,但您应该查找哪些类消耗了最大内存,然后检查谁在持有它们。不确定是否应该很容易找出内存使用情况及其瓶颈。
    • 是的,问题出在我最初假设的地方。添加了 MAT 输出以供参考。
    • 从内存消耗来看,我认为大部分内存都被会话工厂持有,您是否使用任何缓存?还是在持久化上下文中加载大量对象?
    【解决方案3】:

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

    解决方案的重要部分在这里发布

    postInstantiate buildSessionFactory slow/memory huge database

    【讨论】:

      【解决方案4】:

      你的hibernate对象的目的是什么,hibernate只适合CURD(创建、更新、读取、删除),但不适合计算。对于任何计算目的(特别是交叉表),将存储过程和 ibatis 一起使用会更好。

      【讨论】:

      • 项目要求是多个 RDBMS 目标(即 Oracle、PGSQL、MSSQL、MySQL...),这让 ibatis 成为一个非常(非常!)昂贵的选择。另外,我非常不同意 Hibernate 只适用于 CRUD 操作。
      猜你喜欢
      • 2011-02-20
      • 2022-01-16
      • 2014-01-04
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多