オブジェクトがあり、そのコンポーネントのサイズと比較してオブジェクトのサイズを概算したい場合、これを行うことはできますか?
Object には int フィールドと float フィールドがあります。したがって、そのオブジェクトのスペース使用量は、そのオブジェクトへの参照のサイズ(8)バイト + 2 つのプリミティブ値のサイズ 16+16 であり、40 バイトまたは 25% の余分なスペースが必要になります。
オブジェクトのおおよそのサイズを確認する 1 つの方法は、そのオブジェクトのインスタンスを多数作成し、前後のメモリを確認することです。より正確な数値を取得するには、特定の JVM 引数を使用できます。
-verbose:gc -XX:-UseTLAB
verbose:gc
測定の途中で GC が発生しないようにするため-XX:-UseTLAB
チャンクでメモリを割り当てないように JVM に要求します (それ以外の場合は効率のために行います)。このオプションをオフにすると、より正確で安定した結果が得られます。Runtime.getRuntime().freeMemory();
その後、割り当ての前後に呼び出してメモリ使用量を監視できます。
フィールドを追加しても、必ずしもメモリ使用量が増加するわけではないことに注意してください。たとえば、hotspot 7 64 ビットでは、オブジェクトは 16 バイトのメモリをint
必要としますが、そのオブジェクトにフィールドを追加してもサイズは変わりません (つまり、1 つのint
フィールドを保持するオブジェクトは、その JVM でも 16 バイトです)。これは、メモリ アライメントの制約によるものです。
java.lang.instrumentation パッケージを使用できます。
http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html
これには、実装固有のオブジェクト サイズの近似値と、オブジェクトに関連するオーバーヘッドを取得するために使用できるメソッドがあります。
セルゲイがリンクした回答には素晴らしい例があり、ここに再投稿しますが、彼のコメントからすでに見ているはずです:
import java.lang.instrument.Instrumentation;
public class ObjectSizeFetcher {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}
getObjectSize を使用します。
public class C {
private int x;
private int y;
public static void main(String [] args) {
System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
}
}