计算对象数组的内存大小时,以下代码会得到"使用了24字节",这符合预期,据我所知,其中包括:
4字节(元素指针)+ 16字节(对象头)+ 4字节(元素空间)= 24字节
// with JVM argument -XX:-UseTLAB
public static void main(String[] args) {
long size = memoryUsed();
Object[] o = new Object[]{1};
//Object[] o = new Object[]{1L};
size = memoryUsed() - size;
System.out.printf("used %,d bytes%n", size);
//Output: used 24 bytes
}
public static long memoryUsed() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
但是当元素类型更改为 Long(1L)时,结果令人困惑,大多数情况下是"使用了9,264字节",有人能帮助我吗?这两种元素类型之间的内存分配差异是什么?
// with JVM argument -XX:-UseTLAB
public static void main(String[] args) {
long size = memoryUsed();
//Object[] o = new Object[]{1};
Object[] o = new Object[]{1L};
size = memoryUsed() - size;
System.out.printf("used %,d bytes%n", size);
//Output: used 9,264 bytes
}
Long
及其内部类Long.LongCache
),这会消耗比您预期更多的内存。 - Thomas Kläger