Java, почему различное использование памяти для примитивного и массив объектов в 2D

Соответствующий код

int row = 100000;
int col = 18;
Object[][] objectArray = new Object[row][1];
int[][] intArray = new int[row][1];
System.out.println("Size of objectArray = " + net.sourceforge.sizeof.SizeOf.deepSizeOf(objectArray) + " bytes");
System.out.println("Size of intArray = " + net.sourceforge.sizeof.SizeOf.deepSizeOf(intArray) + " bytes");
Object[][] objectMatrix = new Object[row][col];
int[][] intMatrix = new int[row][col];
System.out.println("Size of objectMatrix = " + net.sourceforge.sizeof.SizeOf.deepSizeOf(objectMatrix) + " bytes");
System.out.println("Size of intMatrix = " + net.sourceforge.sizeof.SizeOf.deepSizeOf(intMatrix) + " bytes");

Соответствующий вывод

Size of objectArray = 4000024 bytes
Size of intArray = 4000024 bytes
Size of objectMatrix = 17600024 bytes
Size of intMatrix = 10400024 bytes

Если вместо 1D (число cols = 1), у меня есть 2D (число cols > 1), матрица объекта занимает больше места.

Может кто-нибудь объяснить причину?

Изменить: добавлен еще один случай с одной строкой

int row = 1;
 int col = 2;
 Object[][] objectArray = new Object[row][1];
 int[][] intArray = new int[row][1];
 System.out.println("Size of objectArray = " + net.sourceforge.sizeof.SizeOf.deepSizeOf(objectArray) + " bytes");
 System.out.println("Size of intArray = " + net.sourceforge.sizeof.SizeOf.deepSizeOf(intArray) + " bytes");
 Object[][] objectMatrix = new Object[row][col];
 int[][] intMatrix = new int[row][col];
 System.out.println("Size of objectMatrix = " + net.sourceforge.sizeof.SizeOf.deepSizeOf(objectMatrix) + " bytes");
 System.out.println("Size of intMatrix = " + net.sourceforge.sizeof.SizeOf.deepSizeOf(intMatrix) + " bytes");

Выход

Size of objectArray = 64 bytes
Size of intArray = 64 bytes
Size of objectMatrix = 72 bytes
Size of intMatrix = 64 bytes
1 ответ

Размер ссылки внутри массива объектов зависит от многих факторов (32-разрядный или 64-разрядный), или если вы находитесь в 64-битном режиме, вы используете сжатыеOOP? Поскольку я обычно работаю в 64-битной среде, я всегда ожидал, что Object [] займет больше памяти. С другой стороны, int в Java определяется как 32-битное значение, поэтому с int [] у вас будет 32 бита, используемые для каждого значения плюс некоторые накладные расходы для самого объекта массива.

licensed under cc by-sa 3.0 with attribution.