6

これは Java 6 メモリ モデルの後です。32 ビット JVM では、オブジェクトの浅いサイズは

8 bytes (object header) + total of all instance variables + padding (optional)

最初の 2 つの項の合計が 8 の倍数にならない場合は、パディングが行われます。

64 ビット JVM では、浅いサイズは

16 bytes (object header) + total of all instance variables + padding (optional)

私の理解では、この Object ヘッダーは 2 つの単語 (oracle hotspot VM) で構成されています。

  • クラスワード
  • マークワード

32 ビット JVM では、オブジェクト ヘッダー = 2 * 32 ビット = 64 ビット = 8 バイト
64 ビット JVM では、オブジェクト ヘッダー = 2 * 64 ビット = 128 ビット = 16 バイト

ただし、CompressedOops を使用すると、下位 3 ビットが切り捨てられるため、32 ギガ未満のヒープの場合、64 ビット JVM では 8 バイトに戻るはずです。

しかし、JOL (Java Object Layout) を使用してオブジェクト レイアウトをテストしたところ、オブジェクト ヘッダーに 12 バイトが表示されました。

テストコード

public class App  {
    public static void main( String[] args )
    {
        System.out.println(System.getProperty("java.version"));
        System.out.println(VMSupport.vmDetails());
        System.out.println(ClassLayout.parseClass(A.class).toPrintable());
    } 
}

class A {
   int a; 
}

出力

1.8.0_05
Running 64-bit HotSpot VM.
Using compressed references with 3-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

com.layout.test.jolTesting.A object internals:
 OFFSET  SIZE  TYPE DESCRIPTION                    VALUE
      0    12       (object header)                N/A
     12     4   int A.a                            N/A
Instance size: 16 bytes (estimated, the sample instance is not available)
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

これらの追加の 4 バイトを追加するために、ここで欠けているのは何ですか?

4

2 に答える 2