【发布时间】:2014-11-27 09:34:37
【问题描述】:
我在 DatabaseField 类上有内存泄漏问题。它消耗越来越多的内存,并且在 gc 操作期间从不释放任何内存。每次我们启动压力测试时,它都会在 2 周后保持 20mb 内存,导致我的服务器崩溃。
这个类和垃圾收集器的交互是什么。
【问题讨论】:
标签: jpa memory-leaks eclipselink
我在 DatabaseField 类上有内存泄漏问题。它消耗越来越多的内存,并且在 gc 操作期间从不释放任何内存。每次我们启动压力测试时,它都会在 2 周后保持 20mb 内存,导致我的服务器崩溃。
这个类和垃圾收集器的交互是什么。
【问题讨论】:
标签: jpa memory-leaks eclipselink
您必须使用诸如VisualVM 或MAT 之类的内存堆分析工具,但无论如何,这很难解决。
这里有answer about it 和this post 告诉你如何使用VisualVM 捕捉它。
祝你好运! (你需要它;-))
【讨论】:
看起来您在 EclipseLink 邮件列表中发布了更多信息,但仍不足以说明问题所在。许多工具都能够追踪对象持有的东西,因此它不会被 GCd;如果您追踪 DatabaseField,我敢打赌,您会在应用程序中发现导致泄漏的问题。
根据我的经验,使用 JPA 时内存泄漏的最常见原因是应用程序缓存从不同 EntityManager 读取的实体。由于这些实体具有对读取它们的上下文的引用,它们阻止了 EntityManager 被 GC,这也阻止了它的内部对象和缓存被 GC。解决方案是不在您的应用程序中缓存实体 - 它们已经缓存在 JPA 中,因此您正在复制内存使用量,而不会受益于通过应用程序进行的更改在应用程序的缓存中更新。只需存储实体的 ID 并在需要时使用 find 调用来检索它。如果必须使用缓存,您可以使用只读查询来检索要缓存的实体,如下所述: http://docs.oracle.com/cd/E27559_01/doc.1112/e28552/toplink.htm
【讨论】: