0

オブジェクトがあり、そのコンポーネントのサイズと比較してオブジェクトのサイズを概算したい場合、これを行うことはできますか?

Object には int フィールドと float フィールドがあります。したがって、そのオブジェクトのスペース使用量は、そのオブジェクトへの参照のサイズ(8)バイト + 2 つのプリミティブ値のサイズ 16+16 であり、40 バイトまたは 25% の余分なスペースが必要になります。

4

2 に答える 2

4

オブジェクトのおおよそのサイズを確認する 1 つの方法は、そのオブジェクトのインスタンスを多数作成し、前後のメモリを確認することです。より正確な数値を取得するには、特定の JVM 引数を使用できます。

-verbose:gc -XX:-UseTLAB
  • verbose:gc測定の途中で GC が発生しないようにするため
  • -XX:-UseTLABチャンクでメモリを割り当てないように JVM に要求します (それ以外の場合は効率のために行います)。このオプションをオフにすると、より正確で安定した結果が得られます。

Runtime.getRuntime().freeMemory();その後、割り当ての前後に呼び出してメモリ使用量を監視できます。

フィールドを追加しても、必ずしもメモリ使用量が増加するわけではないことに注意してください。たとえば、hotspot 7 64 ビットでは、オブジェクトは 16 バイトのメモリをint必要としますが、そのオブジェクトにフィールドを追加してもサイズは変わりません (つまり、1 つのintフィールドを保持するオブジェクトは、その JVM でも 16 バイトです)。これは、メモリ アライメントの制約によるものです。

于 2013-02-12T11:01:14.377 に答える
0

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()));
}

}

于 2013-02-12T11:01:13.153 に答える