讓我們假設我們正在談論最近的32位Sun JVM。
- 每個Integer對象有1個
int
字段 - 佔用4個字節。
- 每個Integer對象都有2個標題字 - 佔用8個字節。
- 分配的粒度是(我相信)2個字 - 4個字節的填充。
- Integer []對每個數組元素/位置有4個字節的引用。
所以總數爲每個數組元素20個字節。 20 x 30 x 1,000,000 = 600,000,000 Mbytes。現在添加這樣一個事實,即世代收集器將分配至少3個不同大小的對象空間,並且可以輕鬆地添加高達900+兆字節。
how could i fix it ?
- 使用
int[]
而不是Integer
。
- 如果
Integer
值主要代表-128至+127範圍內的數字,請將其分配爲Integer.valueOf(int)
。 JLS保證以這種方式創建的Integer
對象將被共享。 (請注意,當通過自動裝箱創建Integer
時,JLS規定使用valueOf
。因此,實際上,此「修復」已在您的示例中應用。)
- 如果您的
Integer
值大多來自較大但仍然很小的域,請考慮實施您自己的緩存以共享Integer
對象。
My question was about Integer as an example, in my program i use my own object that only holds an array of bytes (max size of 4). when i create it, it takes a lot more then 4 bytes on the memory.
是的,它會做。
讓我們假設你的類是這樣定義的:
public class MyInt {
private byte[] bytes = new byte[4];
...
}
每個MyInt
將佔據:
MyInt
頭的話 - 8個字節
MyInt.bytes
場 - 4字節
- 填充 - 4字節
- 標題w ORDS爲字節數組 - 12個字節
- 陣列內容 - 4個字節
現在添加由MyInt
參考所佔用的空間:
總共 - 36個字節/ MyInt
元素的一個MyInt[]
。
相比之下,與每一個每int[]
的int
元件的Integer[]
或4字節Integer
元件20個字節。
以更多堆內存運行程序。 – 2011-05-21 13:16:22