如何模拟内存不足:请求的arrays大小超过VM限制

我使用了太阳网站的Out Of Memory帮助 。 引用的地方

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

但上面的线正在产生

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

我错过了什么?

更新:我的java版本是

 $ java -version
 java版“1.6.0_15”
 Java(TM)SE运行时环境(版本1.6.0_15-b03)
 Java HotSpot(TM)服务器VM(内置14.1-b02,混合模式)

为了我

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

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

PS: 如果你需要为了测试而产生exception,你也可以自己throw new OutOfMemoryError("Requested array size exceeds VM limit")

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

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

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

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

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

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