2012-08-09 40 views
1

我正在調試我一直在研究的一個相當大的項目(但最初並未創建),並且我注意到它有時會與OutOfMemoryError崩潰。代碼正在從文件中加載大量數據,所以這通常並不令人驚訝。如果我的堆沒有滿,我如何得到「java.lang.OutOfMemoryError:Java堆空間」?

但是,讓我感到困惑的是,我使用VisualVM 1.3.4來分析程序,它的行爲不一致。大多數時候,我已經運行它,堆逐漸膨脹到2GB左右(計算機有16GB的RAM;這是爲了學術研究),使用的堆越來越高。大約2GB,它會崩潰。隨着時間的推移,該程序不會進行更多信息,所以它不應該在幾分鐘內將堆增加到2GB。

雖然有時候,我會在大約30秒後突然崩潰,堆大小爲250MB,使用中只有大約100MB。如果我的堆沒滿,我如何獲得java.lang.OutOfMemoryError: Java heap space

編輯:我使用Eclipse來運行該程序,並且我有VisualVM插件,以便它自動啓動。另外,我正在使用Java 7.

+0

JVM設置爲的最大堆是多少?它不會自動調整內存大小。 – Mikaveli 2012-08-09 13:44:58

+0

您使用的是什麼版本的Java?你使用了什麼命令行參數? (有些參數會阻止你的堆的大小調整使用它的全部) – 2012-08-09 13:46:34

+0

需要更多的信息來評論... – 2012-08-09 13:46:37

回答

1

原來使用的OpenJDK JRE,而不是甲骨文的JRE的墜機引起的。我不確切知道OpenJDK中的錯誤是什麼讓它像這樣崩潰,但是改用Oracle的JRE最終解決了這個問題。我正在使用OpenJDK,因爲我在一臺Linux計算機上,有人在我之前使用的是開源工作,當我向他提到崩潰時,他的想法是這可能是原因,他是對的)

2

使用VM參數-XX:+HeapDumpOnOutOfMemoryError啓動應用程序。

分析堆轉儲並找出造成問題的原因。

Eclipse MAT是一個很好的找出這些問題的工具。

+0

好吧,我現在要去看看MAT。 – MalcolmOcean 2012-08-09 14:10:36

+0

我試着將這個參數添加到虛擬機,但是如果它傾倒堆,我不知道在哪裏。 – MalcolmOcean 2012-08-09 17:23:17

+0

它將在您的過程目錄中並可配置。 http://stackoverflow.com/a/543037/628943 – 2012-08-09 17:30:50

1

你需要設置的JVM最小和最大堆內存

設置JAVA_OPTS = 「 - Xms128m -Xmx256m」

類似的東西,但像2G更大的價值,無論4G

LE:衆所周知,你不能強制JVM運行垃圾收集器(儘管你可以要求它),但是有一些方法可以說服它通過清空它們的引用來擺脫某些項目。另外需要注意的是可能會被初始化的數據庫對象。當您嘗試創建超出最大堆內存的對象時,可能會出現該錯誤。

另一個想法可能是一些智力遲鈍的開發者,在某些方法中由於某種延遲原因而以編程方式拋出OutOfMemoryError。當你到達那部分代碼時,這就是你所得到的(搜索項目)

+0

這不是堆的大小本身就是問題......正如我所說的那樣,它很高興地擴展得更高,但它不應該首先擴展。事情正在增加到內存中,但沒有被刪除。 – MalcolmOcean 2012-08-09 14:30:48

1

應用程序崩潰與OutOfMemoryError至少有兩個原因。

  1. 您的java堆對於需要處理的數據量來說太小了。然後,您可以按照建議的Matei來增加它,也可以將堆轉儲分析爲建議Ajay。

  2. 您的應用程序泄漏內存。這意味着它在處理完內存後會在內存中留下一些不需要的數據。然後增加堆將無助於長遠。而你的選擇是要麼堆轉儲分析(再次)或專門的內存泄漏檢測工具,如​​

1

你有一個沒有大內存支持的32位操作系統(PAE取勝,linux上的巨大mem內核......)?如果是,您可能會遇到32位系統上每個進程的2GB內存段限制。

作爲解決辦法,嘗試設置JVM參數-Xss192k,以便爲每個線程配置192kb的堆棧空間,參數-Xmx1024m使用不超過1GB的堆。

相關問題