由于 Java 规范不要求使用内存,这取决于您使用的 JVM 实现。
当然,在所有 JVM 实现中都会有每个对象的开销(例如,为了实现运行时类型检查)。JVM 可能会选择内存对齐字段(在某些平台上,这会在访问字段时显着加快速度)。
但是,如果数组成员为内存对齐而填充,并且可以确认(至少在 Windows 的 oracle vm 上)一个 boolean[] 每个元素占用一个字节,我会感到非常惊讶。
此外,值得注意的是,如果您碰巧处理了一个适当大的堆,则引用类型字段的大小可以是 8 个字节。
总结:如果您真的想知道,请测量目标 JVM 上的内存消耗。
编辑:出于好奇,我写了一个小的(不准确的)基准:
class FourBytes {
byte a,b,c,d;
}
public class Test {
long usedBefore = used();
long used() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
public void before() {
System.gc();
usedBefore = used();
}
public void after(String text) {
long usedAfter = used();
System.out.println(text + "\t" + new BigDecimal(usedAfter - usedBefore).movePointLeft(6) + " bytes");
before();
}
{
int max = 1000000;
before();
boolean[] bools = new boolean[max];
after("boolean in array");
char[] chars = new char[max];
after("char in array ");
Object[] objects = new Object[max];
after("reference type in array");
for (int i = 0; i < max; i++) {
objects[i] = new Object();
}
after("Object instance ");
Byte[] bytes = new Byte[max];
before();
for (int i = 0; i < max; i++) {
bytes[i] = new Byte((byte) i);
}
after("Byte instance ");
Integer[] integers = new Integer[max];
before();
for (int i = 0; i < max; i++) {
integers[i] = new Integer(i);
}
after("Integer instance");
FourBytes[] fbs = new FourBytes[max];
before();
for (int i = 0; i < max; i++) {
fbs[i] = new FourBytes();
}
after("FourBytes instance");
}
public static void main(String[] args) throws Exception {
new Test();
}
}
在
java version "1.7.0_02"
Java(TM) SE Runtime Environment (build 1.7.0_02-b13)
Java HotSpot(TM) Client VM (build 22.0-b10, mixed mode, sharing)
它打印:
boolean in array 1.183624 bytes
char in array 2.091768 bytes
reference type in array 4.091768 bytes
Object instance 8.023664 bytes
Byte instance 16.133408 bytes
Integer instance 16.147312 bytes
FourBytes instance 16.142568 bytes