首页 > 解决方案 > hibernate5 类型配置注册表类中的内存泄漏

问题描述

最近,我们将 hibernate 5 与我们的应用程序集成,从 hibernate 3 升级它。

几个月后,我们开始在 hibernate 5 的类型配置注册表类中看到内存泄漏。

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/type/internal/TypeConfigurationRegistry.java

特别是在 registerTypeConfiguration 方法中创建新的并发 hashmap 时。

  1. 堆转储清楚地表明存在泄漏。
  2. 引导过程中该文件的内容表明它包含所有 dao 类。
  3. 这样一来,应该有一组 DAO 类在启动时注册并在关机时取消注册。
  4. 但它是在运行时引起的内存泄漏。是否有 DAO 类的重复副本?

我们使用 spring 的 localSessionFactoryBean 来与 hibernate 事务管理器集成。

根据 localSessionFactoryBean 文档,它与休眠 5 兼容,这与为什么存在泄漏的问题有关?

依赖项:

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.3.23.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.3.9.Final</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jdbc</artifactId>
    <version>7.0.19</version>
</dependency>

配置:

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource"
          ref="dataSource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.cache.region.factory_class">
                    <<>>
                </prop>
                <prop key="hibernate.dialect">
                    <<>>
                </prop>
            </props>
        </property>
    </bean>
<bean id="txManager"
      class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
</bean>

标签: javaspringhibernate

解决方案


几个月前,我在工作中遇到了类似的问题(来自同一个班级的泄漏,但作为不同休眠工作流程的一部分)。事实证明,每当 Hibernate 创建 a 时,TypeConfiguration它都会在内部将自身注册TypeConfigurationRegistry该文件中。我看到取消注册的唯一地方是作为会话工厂关闭回调的一部分,如此处所示

我们使用SchemaExportHibernate API 和 HBM XML 语法。鉴于没有清除内置 Hibernate 缓存的“官方”方法,我们采用了一种解决方法来获取对内部状态的引用TypeConfigurationRegistry并将其清除。

我知道,这不是最好的方法,但只是想把它放在那里,以防有人像我们一样处于类似的情况。


推荐阅读