如何模拟Out of memory:请求的数组大小超过VM限制

时间:2009-12-10 12:32:04

标签: java jvm out-of-memory

我使用了Out Of Memory help from sun's site。引用的地方

  

内存不足:请求的阵列大小超过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

但上面一行正在制作

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at JavaTest.main(JavaTest.java:7)

我错过了什么?

更新 我的java版本是

$java -version
java version "1.6.0_15"
Java(TM) SE Runtime Environment (build 1.6.0_15-b03)
Java HotSpot(TM) Server VM (build 14.1-b02, mixed mode)

4 个答案:

答案 0 :(得分:21)

对我来说

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")自己。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

只是看一下人们使用java本机接口,C ++应用程序之间的桥梁时,人们就会遇到问题。

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

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

您可以尝试复制此人在此other forum上描述的问题。