"java.lang.OutOfMemoryError: Java heap space"运行以下代码片段时出现异常.我8192M用命令设置了JVM堆大小set JVM_ARGS="-Xms8192m -Xmx8192m".
List<Integer> largeList = new ArrayList<>();
Random rand = new Random();
for(int i=0;i<Integer.MAX_VALUE/2;i++)
{
largeList.add(rand.nextInt(Integer.MAX_VALUE));
}
Run Code Online (Sandbox Code Playgroud)
我认为JVM堆积,我设置,足以容纳数组.
A List只能容纳对象.
一个Integer对象需要的实际值和关于各种对象相关的开销字节的一些量的至少4字节(由JVM而异,但通常是每对象周围16-30字节).
Integer.MAX_VALUE / 2大约十亿.因此,对于单独的数据(没有对象开销),您需要40亿个字节来存储列表.那是4GB.因此,即使对象开销只有4个字节(很难做到,并且在运行时可能效率不高),这已经耗尽了所有8GB的堆(并且没有为运行代码所需的所有类留下任何内容) .而且这甚至不包括ArrayList需要保存许多引用的内存(它们是8或4个字节,具体取决于您使用的JVM和设置).
所以不,你没有为它分配足够的内存.
如果你真的需要那么多的int值,可以考虑使用一个int[]明显高于内存效率的内存效率,有效地将4个字节int用于一个小的固定大小的开销.