2017-10-18 140 views
0

我有此代碼java的整數數組大小混亂

int[] i = new int[127*1024];

正在

int[] i = new int[128*1024];

是投擲

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at memory.main(memory.java:123)

運行此使用的後續在一個64位的Windows機器,命令jdk 1.8 java -Xms1M -Xmx1M memory

根據我的理解,java int是4字節(32位)和int []數組是一個對象。 在上述情況下,如果大小爲131.072字節(128 * 1024),並且堆空間爲1mb,則其失敗 任何人都可以幫助解釋爲什麼它的內存不足?

+2

對不起,您是否認爲堆中沒有其他東西佔用任何空間?說,Java VM的所有其他基礎架構? –

+2

而且大小是128 * 1024 * 4字節(+幾個字節的開銷),所以是你說的4倍。 – biziclop

+1

您對此陣列至少使用128 * 1024 * 4 = 524288字節,剩下的Java將少於1/2Mb。從未見過它在20年內就這麼小。 – EJP

回答

4

數組中每個元素的空間都是在創建數組時分配的。
所有元素都被初始化爲0

int值爲4字節,所以此數組導致128 * 1024 * 4字節被分配,即0.5 Mb。

您的數組是而不是堆中該行唯一的代碼對象,這就是您的JVM爆炸的原因,即使您給了它1 Mb的內存。

您需要爲JVM提供更多內存以避免此錯誤。

+0

@VinodKrishnan有沒有更多的解釋。試試這個:數組創建時分配數組所需的所有空間。爲數組元素賦值使用零內存 - 保存該值的位置已被分配。 – Bohemian