猿问

java.lang.OutOfMemoryError:Java堆空间异常

"java.lang.OutOfMemoryError: Java heap space"运行以下代码段时出现异常。我已经8192M使用command设置了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));

    }

我认为我设置的JVM堆大小足以容纳数组。


精慕HU
浏览 233回答 3
3回答

素胚勾勒不出你

AList只能容纳对象。一个Integer对象的实际值至少需要4个字节,而与各种对象相关的开销则需要一定数量的字节(因JVM而异,但每个对象通常约为16-30个字节)。Integer.MAX_VALUE / 2大约十亿&nbsp;因此,仅对于数据(没有对象开销),您就需要40亿字节来存储列表。那是4GB。因此,即使对象开销只有4个字节(很难做到,并且在运行时可能效率不高),这也已经耗尽了整个8GB的堆(对于运行代码所需的所有类都一无所有) 。而且,这甚至不包括ArrayList为其保留的内存,该内存需要保留许多引用(为8字节或4字节,具体取决于所使用的JVM和设置)。因此,没有,您尚未为其分配足够的内存。如果您实际上需要那么多int值,请考虑使用a&nbsp;int[],后者的内存效率明显高于后者,每有效占用4个字节,int而固定大小的开销却很小。

森栏

当ArrayList满时,其大小将增加50%-因此列表的大小可能高达0.75 * MAX_VALUE = 0.75 * 2 ^ 31 = 16亿。一个Integer在内存中占用16个字节,并且每个Integer引用在列表中占用4或8个字节。让我们在这里假设4。因此,您的列表最多可能需要10亿* 16 + 6亿* 4(对于空条目)= 30 GB的内存。
随时随地看视频慕课网APP

相关分类

Java
我要回答