2013-01-20 54 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。