"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堆大小足以容纳数组。
3 回答
![?](http://img1.sycdn.imooc.com/5333a1bc00014e8302000200-100-100.jpg)
素胚勾勒不出你
TA贡献1827条经验 获得超9个赞
AList
只能容纳对象。
一个Integer
对象的实际值至少需要4个字节,而与各种对象相关的开销则需要一定数量的字节(因JVM而异,但每个对象通常约为16-30个字节)。
Integer.MAX_VALUE / 2
大约十亿 因此,仅对于数据(没有对象开销),您就需要40亿字节来存储列表。那是4GB。因此,即使对象开销只有4个字节(很难做到,并且在运行时可能效率不高),这也已经耗尽了整个8GB的堆(对于运行代码所需的所有类都一无所有) 。而且,这甚至不包括ArrayList
为其保留的内存,该内存需要保留许多引用(为8字节或4字节,具体取决于所使用的JVM和设置)。
因此,没有,您尚未为其分配足够的内存。
如果您实际上需要那么多int
值,请考虑使用a int[]
,后者的内存效率明显高于后者,每有效占用4个字节,int
而固定大小的开销却很小。
![?](http://img1.sycdn.imooc.com/54584d080001566902200220-100-100.jpg)
森栏
TA贡献1810条经验 获得超5个赞
当ArrayList满时,其大小将增加50%-因此列表的大小可能高达0.75 * MAX_VALUE = 0.75 * 2 ^ 31 = 16亿。
一个Integer在内存中占用16个字节,并且每个Integer引用在列表中占用4或8个字节。让我们在这里假设4。因此,您的列表最多可能需要10亿* 16 + 6亿* 4(对于空条目)= 30 GB的内存。
添加回答
举报
0/150
提交
取消