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(colsの数= 1)の代わりに2D(colsの数> 1)がある場合、オブジェクトマトリックスはより多くのスペースを取ります。

誰かが理由を説明できますか?

編集: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ビットの場合はcompressedOOPを実行していますか?私は通常64ビット環境で作業しているので、Object[]がより多くのメモリを占有することを常に期待します。一方、Javaのintは32ビット値として定義されているため、int []を使用すると、各値に32ビットが使用され、配列オブジェクト自体にオーバーヘッドが発生します。

于 2012-04-14T04:03:55.700 に答える