3

相关代码

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(列数 = 1),而是 2D(列数 > 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
4

1 回答 1

1

对象数组中引用的大小取决于许多因素(32 位与 64 位),或者如果您使用 64 位,您是否正在运行压缩的 OOP?由于我通常在 64 位环境中工作,我总是希望 Object[] 占用更多内存。另一方面,Java 中的 int 被定义为 32 位值,因此使用 int[] 您将为每个值使用 32 位,加上数组对象本身的一些开销。

于 2012-04-14T04:03:55.700 回答