我的應用程序提取大量的幾何數據。我使用Eclipselink 2.4.1將這些數據保存在MySQL數據庫中。該應用程序以批處理方式工作,即我收集一組數據,然後堅持它,繼續下一組數據,堅持它,等等。另一個應用程序後來讀取數據並對其進行處理,但這個問題僅僅是關於收集數據的第一個應用程序。如何防止Eclipselink使用緩存消耗所有內存?
數據收集應用程序運行一段時間。我使用一套固定的EntityManagers
,它們是在啓動時創建的,並且直到應用程序完成時纔會生效。提取是多線程的,每個線程有一個EntityManager。我的問題是,無論如何配置緩存,過了一段時間EclipseLink會佔用所有內存,過了一段時間後,我會得到一個OutOfMemoryError
。
我用VisualVM
來提取我使用Eclipse Memory Analyzer
分析的堆轉儲。可疑的內存量由EntityManagerImpl.extendedPersistenceContext.cloneMapping
保存。該映射保存對我的幾何數據對象的引用。隨着時間的推移,這張地圖的大小會達到幾百兆,這就是導致內存不足錯誤的原因。
我已經試過如下:
- 我通過配置
eclipselink.persistence-context.reference-mode=weak
使用弱引用。我已經驗證EntityManagerImpl.extendedPersistenceContext.cloneMapping
是IdentityWeakHashMap
的類型。從documentation about weak caches我希望使用參考模式weak
解決了這個問題。不幸的是,垃圾收集器仍然沒有聲明條目,並且我一直收到內存不足的錯誤。 - 我試圖用
eclipselink.cache.shared.default=false
完全關閉高速緩存。問題依然存在。
有沒有人有關於這裏發生了什麼的建議以及我如何解決這個問題?我也接受建議如何繞過這個問題。
我意識到這是舊的,但你可以嘗試參考模式FORCE_WEAK。但是,它仍然可能無法解決您的問題; EclipseLink中似乎存在一個錯誤:https://www.eclipse.org/forums/index.php/t/302044/ - 它最終會填充空的QueuableWeakCacheKeys。 – Erhannis
謝謝。我從此完全停止使用EclipseLink。 – Valentin