gpt4 book ai didi

java - 调试内存泄漏 - org.hibernate.engine.StatefulPersistenceContext

转载 作者:行者123 更新时间:2023-11-30 10:14:35 33 4
gpt4 key购买 nike

有一个连接到 Oracle DB 以读取数据的服务,它使用 Hibernate-3.6SpringData-JPA-1.10.x。堆转储频繁生成,导致主机内存不足。

在使用 Eclipse MAT 分析了几个 heapdump 后,发现大部分内存都累积在 org.hibernate.engine.StatefulPersistenceContext -> org.hibernate.util.IdentityMap -> java.util.LinkedHashMap 的一个实例中.

enter image description here泄密嫌疑人说

The thread java.lang.Thread @ 0x84427e10 ... : 29 keeps local variables with total size 1,582,637,976 (95.04%) bytes.

The memory is accumulated in one instance of "java.util.LinkedHashMap" loaded by "".

在 StackOverflow 上搜索它,它说 SessionFactory 应该是单例的,并且 session.flush() 和 session.clear() 应该在每次调用之前调用以清除缓存。但是 SessionFactory 没有在代码中显式初始化或使用

这里内存泄漏的原因是什么(看起来每个查询的结果都被缓存了,没有被清除)以及如何修复它?

有关 Spring Data 配置的更多信息:

TransactionManager 初始化为:

<tx:annotation-driven mode='proxy' proxy-target-class='true' />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
....
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" depends-on="...">
....
</bean>

为了与表交互,声明了一个扩展 Spring Data RepositoryJpaSpecificationExecutor 的接口(interface)。两者都输入到它将处理的域类中。

API Activity 方法具有注释 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)

最佳答案

根据您的描述,这是我期望的结果:

Hibernate(实际上通常是 JPA)在 session 的生命周期内保留对其加载或保存的所有实体的引用。

在典型的 Web 应用程序设置中,这不是问题,因为。一个新 session 从每个请求开始,并在请求完成并且不涉及那么多实体后关闭。

但是对于您的应用程序, session 似乎一直在增长和增长。我可以想象以下原因:

  • 某些东西一直在打开的 session 中运行,而从未关闭。可能类似于批处理作业或定期运行的计划作业。

  • Hibernate 的配置方式使其在不关闭 session 的情况下重复使用同一 session 。

为了找到罪魁祸首,启用日志记录以打开和关闭 session 。从https://hibernate.atlassian.net/browse/HHH-2425来看org.hibernate.impl.SessionImpl 应该是正确的日志类别,您可能需要跟踪级别的日志记录。

现在测试对服务器的各种请求,看看是否有任何 session 已打开但未关闭。

关于java - 调试内存泄漏 - org.hibernate.engine.StatefulPersistenceContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50822557/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com