2012-01-23 27 views
2

我們有一個RHEL5系統,帶有25GB內存,2個四核英特爾至強(共8個內核) 並隨機獲取堆大小錯誤。tomcat:OutOfMemoryError:Java堆空間 - 24GB系統

我們的java選項是-Xmx10240m-Xms10240m-XX:PermSize=256m-server-Xss1024k。 上面的配置有什麼問題嗎?

錯誤:

java.lang.OutOfMemoryError: Java heap space 
    at net.sf.ehcache.store.DiskStore.throwableSafeExpireElementsIfRequired$ 
    at net.sf.ehcache.store.DiskStore.spoolAndExpiryThreadMain(DiskStore.ja$ 
    at net.sf.ehcache.store.DiskStore.access$800(DiskStore.java:65) 
    at net.sf.ehcache.store.DiskStore$SpoolAndExpiryThread.run(DiskStore.ja$ 

TIA

+0

您使用64位系統和Java或RHEL + PAE內核嗎?這是一個很好的機會,你必須調試內存轉儲找出什麼泄漏。 –

+0

64位RHEL抱歉忘了提及。 –

+0

堆OOM通常意味着泄漏。問題的哪一部分是堆?伊甸園,倖存者,終身教職?你有沒有使用jconsole或這個工具http://www.yourkit.com/java/profiler/它有30天eval,但我們習慣了它發現我們的泄漏。如果你有一個大的堆轉儲,考慮有一個大的內存調試機器,否則它將需要一段時間來交換。 –

回答

0

-XX:+HeapDumpOnOutOfMemoryError運行您的JVM,打開轉儲分析器來分析一下在吃你的堆。否則,你會花費無數個小時來猜測可能出錯的地方。

另見this SO post

+0

更可能的是,它將成爲ehcache。 :-)(當然,引發OOME的堆棧並不是真正與誰使用最多的內存有關,我的陳述僅僅是因爲它顯示了在JVM中使用ehcache的證據。) – ziesemer

+0

是的,但你可以深入並查看Ehcache的內容。例如,我已經看到1.5G字符串被緩存了幾次 - 這可以讓你找到問題的根源。 – mindas

0

如果您正在運行那麼多的內存,也許您的應用程序本身存在另一個問題。

嘗試在您的JVM設置下列選項並再次運行:

-XX:HeapDumpPath=myHeapDumpPath 
-XX:+HeapDumpOnOutOfMemoryError 

然後運行堆通過內存轉儲分析儀。 Eclipse Memory Analyzer工作正常,並且是開源的。它有一個選項來分析內存泄漏。

鑑於這些類來自ehcache,很可能您正在緩存太多對象並耗盡內存。您可能需要調整您的ehcache設置,以限制它存儲的內容。內存分析工具應該幫助確定你緩存的內容。

0

寫-Xmx10g會更清楚。時間到配置文件。您可以從免費的VisualVM開始,並使用它獲取有關內存全部消失的配置文件信息。

+1

10240m是10千兆字節,不是1. – Wyzard

+0

哦,哎呀。編輯。 – bmargulies