2013-01-20 49 views
0

我得到這個錯誤:Java的堆空間了海量的免費堆空間

Exception in thread "543" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Arrays.java:2894) 
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:117) 
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:407) 
at java.lang.StringBuffer.append(StringBuffer.java:241) 

在應用程序中開始使用此命令:

java -Xms1024M -Xmx3072M -jar MyJar.jar >> /var/log/MyLog.log 2>&1 & 

雖然OS報道4GB的27%正在使用RAM。

按我的計算,應該有近2GB的免費堆空間。難道由於某種原因,JVM不會從初始堆增加堆大小?

有什麼可以導致這個錯誤與堆空間實際上可用?

請注意,這全部在1.6JVM上。具體來說:java-1.6.0 -openjdk-1.6.0.0-1.50.1.11.5.el6_3.x86_64

編輯:正在建立的字符串不能是2GB長。它由固定長度的物體組成,不能超過幾百個字符。

+0

我肯定會改變我的設計。 –

+0

你是如何獲得27%的數字的?另外,是否有解釋爲什麼操作系統的數字(27%)和你的數字(〜2GB)相差兩倍? – NPE

+0

激活'verbose GC'並顯示結果...此外,您使用該StringBuffer構建了什麼? – home

回答

0

如果分配的對象不適合堆,則會拋出OutOfMemoryError。根據使用中的垃圾收集器,堆可能被分割成幾代。如果即使在垃圾收集之後被分配的數組大於適當的內存區段,JVM仍可能會拋出OutOfMemory,即使它仍留有內存。

要驗證是否屬於這種情況,請嘗試記錄無法創建的數組大小。

0

當java試圖分配內存(在你的情況下Array#copyOf),並看到它是不可能適應用-Xmx選項指定的最大堆大小它不會執行實際的分配,但會引發OOM異常。這就是爲什麼OS報告使用了27%的RAM。