Java堆空间有大量的可用堆空间

时间:2013-01-20 19:19:17

标签: java out-of-memory heap-memory

我收到了这个错误:

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 &

虽然操作系统报告使用了4%RAM的27%。

根据我的计算,应该有近2GB的可用堆空间。可能是因为某种原因JVM没有从起始堆增加堆大小?

是否有任何可能导致此错误的堆空间实际可用?

请注意,这一切都在1.6JVM上。具体来说:java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.x86_64

编辑:正在构建的字符串不能长2GB。它由固定长度的对象数组构成,最终不会超过几百个字符。

2 个答案:

答案 0 :(得分:0)

如果正在分配的对象不适合堆,则抛出OutOfMemoryError。根据使用的垃圾收集器,堆可以分段成代。如果即使在垃圾收集之后,正在分配的数组大于适当的内存分区,JVM也可能抛出OutOfMemory,即使它仍然有内存。

要验证是否是这种情况,请尝试记录无法创建的数组的大小。

答案 1 :(得分:0)

当java尝试分配内存时(在Array#copyOf的情况下)并且看不到符合-Xmx选项指定的最大堆大小,它不会执行实际分配但会抛出OOM异常。这就是OS报告使用27%RAM的原因。

相关问题