天蓬老师2017-04-18 10:51:59
浅いサイズを明確に説明したい場合は、保持サイズについて言及する必要があります。
浅いサイズ: 独自のオブジェクトが占めるサイズを示します。
保持サイズ: 自身のオブジェクト + 参照オブジェクトの保持サイズ。
まず、この図を借りてみましょう。この図は、それらの間の計算関係をより明確に表すことができます。
Bの浅いサイズ = B;
B の保持サイズ = B の浅いサイズ + C の保持サイズ + D の保持サイズ;
例を示す前に、まずヒープ内の JAVA オブジェクトのストレージを理解する必要があります。例として 32 ビット JVM 仮想マシンを取り上げます。
JAVA オブジェクトはヒープ内の 3 つの部分で構成されます。
オブジェクト ヘッダーには 2 つのデータ部分が含まれています。
1 つは実行時データです。 32 ビット JVM は 32 ビット、つまり 4 バイトです。 64 ビットは 8 バイトです。
2: 型ポインター。
は、インスタンス変数を格納するデータであり、変数の型には2つの基本型変数と参照変数があります。
基本型変数が占めるバイトのサイズについては話さないようにしましょう。参照変数の場合、ポインターが格納されます。
オブジェクトの保存領域が 8byte の整数倍である場合、オブジェクトヘッダー + インスタンスデータが 8byte の整数倍未満の場合、埋められます。
以下、例に基づいて説明しましょう:
リーリー
浅いサイズはインスタンス変数に参照があるかどうかとは関係がないため、まず **TestObjSize の浅いサイズを分析します。浅いサイズ = 4byte (オブジェクト ヘッダー) + 4byte (型ポインター) + 4byte (int a) + 1byte (boolean b ) + 4byte (TestObjSize 参照) = 17;**
17 は 8 の整数倍ではないため、TestObjSize タイプのインスタンス オブジェクトの最終的な浅いサイズは 7 バイトになります。 ;
obj2 の保持サイズ = obj2 の浅いサイズ = 24;
obj1 オブジェクトの testObjSize は obj2 であるため、obj1 の保持サイズ = obj1 の浅いサイズ + obj2 の保持サイズ = 48;
間違いがありましたら、教えてください。