12

我使用了sun 网站的 Out Of Memory 帮助。它被引用为

内存不足:请求的数组大小超过 VM 限制

这表明应用程序试图分配一个大于堆大小的数组。例如,如果应用程序尝试分配一个 512MB 的数组,但最大堆大小为 256MB,则会抛出此错误。在大多数情况下,问题可能是堆大小太小,或者错误导致应用程序尝试创建一个大小被计算为错误地大的数组。

我试图通过

import java.util.ArrayList;
import java.util.List;

public class JavaTest {
    public static void main(String[] args){
        long[] ll = new long[64*1024*1024];
    }
}

在我的机器上

javac *.java;java -Xmx256m JavaTest

但是上面的生产线正在生产

线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间
    在 JavaTest.main(JavaTest.java:7)

我错过了什么?

更新: 我的 java 版本是

$java -版本
java版本“1.6.0_15”
Java(TM) SE 运行时环境 (build 1.6.0_15-b03)
Java HotSpot(TM) 服务器虚拟机(build 14.1-b02,混合模式)
4

4 回答 4

26

为了我

long[] l = new long[Integer.MAX_VALUE];

产量Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit

 

PS:如果您需要出于测试目的产生异常,您也可以throw new OutOfMemoryError("Requested array size exceeds VM limit")自己。

于 2009-12-10T12:58:55.933 回答
1

该数组被分配为连续的堆空间,并且由于对象分配和垃圾收集,内存可能会变得碎片化。内存不足错误是由于缺少用于分配阵列的可靠内存块而发生的。您是否使用 -Xmx 标志显式发送了 JVM 内存?

于 2009-12-10T12:39:56.853 回答
0

尝试分配一个 ArrayList 并将其运行时大小加倍。

于 2009-12-10T12:38:09.167 回答
0

只是看看人们的例子,当人们使用 java 本机接口时,似乎会出现问题,这是 C++ 应用程序之间的桥梁。

当运行纯 java 应用程序时,分配数组的标准过程似乎是从数组减速中传递的大小变量中计算所需的字节数,并抛出java.lang.OutOfMemoryError: Java heap space异常。

当数组在 JVM 之外创建时,它看起来会生成另一个异常。我确信这种不同的行为有一些技术原因。

您可以尝试复制此人在其他论坛上描述的问题。

于 2009-12-10T13:12:56.677 回答