Java堆空间不足,有大量可用堆空间

Java堆空间不足,有大量可用堆空间,java,out-of-memory,heap-memory,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(A

我得到了这个错误:

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长。它是由一个固定长度的对象数组构造而成,不能超过几百个字符。

如果要分配的对象不适合堆,则抛出OutOfMemoryError。根据所使用的垃圾收集器,堆可以分为几代。如果被分配的数组在垃圾收集之后仍然大于相应的内存段,那么JVM可能会抛出OutOfMemory,即使它仍然有剩余内存


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

当java尝试分配内存(在您的例子中是在
数组#copyOf
上)时,发现无法满足使用-Xmx选项指定的最大堆大小,它不会执行实际分配,但会引发OOM异常。这就是为什么OS报告使用了27%的RAM

我肯定会改变我的设计。你是如何得到27%的数字的?另外,有没有解释为什么操作系统的数字(27%)和您的数字(2GB)相差两倍?激活
verbose GC
,并显示结果。。。此外,您使用StringBuffer构建了什么?您是否已经厌倦了分析内存消耗?操作系统告诉您的可用信息可能并不准确。它是用于JVM进程还是整个操作系统?它也可能是您正在复制的一个非常大的字符串,因此JVM告诉您它无法容纳它。这根绳子有多大?另外,我不确定JVM中是否存在,但它可能需要一个连续块来执行此操作,并且可能不可用。