"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
而固定大小的開銷卻很小。

森欄
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
提交
取消