2011-01-21 66 views
3

我有一个使用JPA在Glassfish上运行的简单EAR应用程序。它从我的Oracle数据库表中读取记录并处理它们。一旦被处理,它们在数据库中被标记为如此,然后我在实体管理器上调用clear(),以便处理的对象可以被分离和GC化。但是,尽管自从我们添加了clear()堆用法后,整体堆仍然在增加,并最终达到最大堆。没有其他可能导致泄漏的物体,我不知道我能做些什么。我们也关闭了JPA缓存。Java持久性(JPA)堆问题

<property name="eclipselink.cache.shared.default" value="false"/> 

有没有人知道我能做些什么来确保没有JPA对象被保留?这可能与交易有关吗?每次我们更新要处理的最后一批记录时,我们都会使用新的交易。

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

任何建议表示赞赏。我知道我可以配置应用程序,但很难看到问题,即使我希望它是某些未被收集的JPA对象,但我不确定我在清理实体方面缺少了什么他们不再需要。

James

+1

好的,适合自己。 – skaffman 2011-01-21 10:54:36

回答

2

使用内存分析器如JProfiler是您的最佳解决方案。

否则请尝试缩小发生内存泄漏的位置。尝试删除处理的每个部分,直到找到罪魁祸首。

您随着时间的推移内存不足吗?或者您正在处理一个最终耗尽内存的大事务吗?

确保您没有任何东西挡住您正在处理的对象。也许包括你的一些代码。你做任何复杂的查询?