我使用JPA在Glassfish上运行一个简单的EAR应用程序。它从我的Oracle DB表中读取记录并处理它们。处理完成后,它们在数据库中被标记为,然后我在实体管理器上调用clear(),以便处理的对象可以分离并进行GC管理。但是,即使我们添加了clear()堆使用量减少,整个堆仍然在增加并最终达到最大堆。没有其他对象可以导致泄漏,我不知道我还能做些什么。我们也关闭了JPA缓存。
<property name="eclipselink.cache.shared.default" value="false"/>
有谁知道我还能做些什么来确保没有保留JPA对象?这可能与交易有关吗?每次我们更新要处理的最后一批记录时,我们都会使用新的交易。
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
任何建议都表示赞赏。我知道我可以分析应用程序,但很难看到问题,即使我这样做,我希望它是一些没有被收集的JPA对象,我不确定我在清理实体方面缺少什么他们不再需要了。
詹姆斯
答案 0 :(得分:2)
使用JProfiler等内存分析器是您的最佳解决方案。
否则尝试缩小发生内存泄漏的位置。尝试删除处理的每个部分,直到找到罪魁祸首。
随着时间的推移你是否会耗尽内存,或者你正在处理一个最终耗尽内存的大事务?
确保没有任何东西抓住正在处理的对象。也许包括你的一些代码。你做过任何复杂的查询吗?