为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

精慕HU 2021-04-05 09:30:52
"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 回答

?
素胚勾勒不出你

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而固定大小的开销却很小。


查看完整回答
反对 回复 2021-04-28
?
森栏

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的内存。


查看完整回答
反对 回复 2021-04-28
  • 3 回答
  • 0 关注
  • 232 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信