0

我收到了这个错误:

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 &

而操作系统报告 27% 的 4GB RAM 正在使用中。

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

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

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

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

4

2 回答 2

0

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

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

于 2013-01-20T19:25:57.487 回答
0

当 java 尝试分配内存(在您的情况下Array#copyOf)并且看到不可能适合使用 -Xmx 选项指定的最大堆大小时,它不会执行实际分配,但会引发 OOM 异常。这就是操作系统报告 27% 的 RAM 正在使用的原因。

于 2013-01-20T19:25:59.093 回答