亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 245 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號