ホットスポットで試してみると(正確な数値はdalvikで得られる数値とは異なる場合がありますが、結論は似ているはずです)、次の結果が得られます。
オブジェクト配列(1000x2x2):76034バイト
オブジェクト配列(2x2x1000):16137バイト
これは大まかな計算と一致しています。
[2][2][1000]
Array # Header Size Memory Number Total
1 16 2 24 1 24
2 16 2 24 2 48
3 16 1000 4016 4 16,064
Grand Total 16,136
[1000][2][2]
Array # Header Size Memory Number Total
1 16 1000 4016 1 4,016
2 16 2 24 1000 24,000
3 16 2 24 2000 48,000
Grand Total 76,016
以下のコードをテストし、で実行し-XX:-UseTLAB
て、より正確な結果を取得します。
public class TestMemory {
private static final int SIZE = 100;
private static Runnable r;
private static Object o;
private static void test(Runnable r, String name, int numberOfObjects) {
long mem = Runtime.getRuntime().freeMemory();
r.run();
System.out.println(name + ": " + (mem - Runtime.getRuntime().freeMemory()) / numberOfObjects + " bytes");
}
public static void main(String[] args) throws Exception {
r = new Runnable() { public void run() { for (int i = 0; i < SIZE; i++) o = new Object[1000][2][2];} };
test(r, "Object array (1000x2x2)", SIZE);
r = new Runnable() { public void run() { for (int i = 0; i < SIZE; i++) o = new Object[2][2][1000];} };
test(r, "Object array (2x2x1000)", SIZE);
}
}