java - 如何防止 Eclipselink 消耗所有缓存内存?

标签 java memory-leaks persistence eclipselink

我的应用程序提取大量几何数据。我使用 Eclipselink 2.4.1 将该数据保存在 MySQL 数据库中。该应用程序以批处理方式工作,即我收集一组数据,然后保留它,然后继续处理下一组数据,保留它,依此类推。另一个应用程序稍后读取该数据并处理它,但这个问题仅与收集数据的第一个应用程序有关。

数据收集应用程序运行了相当长的时间。我使用一组固定的 EntityManager,它们在启动时创建并一直存在,直到应用程序完成。提取是多线程的,每个线程有一个 EntityManager。我的问题是,无论我如何配置缓存,一段时间后 EclipseLink 都会耗尽所有内存,一段时间后我会收到 OutOfMemoryError

我使用 VisualVM 提取堆转储,并使用 Eclipse Memory Analyzer 对其进行分析。 EntityManagerImpl.extendedPersistenceContext.cloneMapping 持有可疑的内存量。该 map 包含对我的几何数据对象的引用。随着时间的推移,该映射的大小会达到数百兆字节,这就是导致内存不足错误的原因。

我已经尝试过以下操作:

  • 我通过配置 eclipselink.persistence-context.reference-mode=weak 来使用弱引用。我已验证 EntityManagerImpl.extendedPersistenceContext.cloneMapping 的类型为 IdentityWeakHashMap。来自 documentation about weak caches我希望使用弱引用模式可以解决问题。不幸的是,垃圾收集器仍然没有声明这些条目,并且我不断出现内存不足错误。
  • 我尝试使用 eclipselink.cache.shared.default=false 完全关闭缓存。问题依然存在。

有人对这里发生的事情以及我如何解决这个问题有建议吗?我也愿意接受如何规避该问题的建议。

最佳答案

一些事情。

首先,您不应该保留长期存在的 EntityManager。您应该为每个事务或每个请求创建一个新的 EntityManger。

其次,确保您的应用程序(静态变量等)不持有对对象的引用,如果有任何内容引用该对象,它不会进行垃圾收集。

关于java - 如何防止 Eclipselink 消耗所有缓存内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13914887/

相关文章:

java - 为 RestEasy 的 Web 服务参数添加描述?

java - Hibernate/JPA 查询语言带有子查询的新实体构造函数 - 无法找到合适的构造函数

java - 已安装的插件未在插件选择中列出

android - 在 Eclipse MAT 中,类(class)末尾的美元符号是什么意思?

mysql - 持久化 dockerized WordPress(使用 LAMP 堆栈)

java - 对象不会更新

java - 实现图形 - Java

memory-leaks - Kotlin 伴随对象内存泄漏?

ios - 核心数据内存泄漏 : Deinit does not get called.。导致内存泄漏

Symfony2 : class 'Doctrine\Common\Collections\ArrayCollection' was not found in the chain configured namespaces