2012-12-17 100 views
1

我的應用程序提取大量的幾何數據。我使用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.cloneMappingIdentityWeakHashMap的類型。從documentation about weak caches我希望使用參考模式weak解決了這個問題。不幸的是,垃圾收集器仍然沒有聲明條目,並且我一直收到內存不足的錯誤。
  • 我試圖用eclipselink.cache.shared.default=false完全關閉高速緩存。問題依然存在。

有沒有人有關於這裏發生了什麼的建議以及我如何解決這個問題?我也接受建議如何繞過這個問題。

+0

我意識到這是舊的,但你可以嘗試參考模式FORCE_WEAK。但是,它仍然可能無法解決您的問題; EclipseLink中似乎存在一個錯誤:https://www.eclipse.org/forums/index.php/t/302044/ - 它最終會填充空的QueuableWeakCacheKeys。 – Erhannis

+0

謝謝。我從此完全停止使用EclipseLink。 – Valentin

回答

2

有幾件事。

首先,你不應該長期居住EntityManagers。您應該爲每個事務或每個請求創建一個新的EntityManger。其次,確保你的應用程序(靜態變量等)不持有對對象的引用,如果有任何東西引用該對象,它將不會被垃圾收集。