gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:28:40 24 4
gpt4 key购买 nike

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

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

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

我已经尝试过以下方法:

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

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

最佳答案

一些事情。

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

其次,确保您的应用程序(静态变量等)没有持有对对象的引用,如果有任何东西引用该对象,它就不会被垃圾回收。

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

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