2012年11月24日土曜日

Javaにおけるオブジェクトの使用メモリサイズの測り方

Javaでオブジェクト(インスタンス)の使用メモリサイズを測る方法のメモです。

1. ライブラリ「sizeOf」を利用する
http://sourceforge.net/projects/sizeof

使い方
上のリンクからSizeOf.jarをダウンロードし、BuildPathを通します。
(eclipseでBuildPathを通す場合は、プロジェクトを右クリックして、BuildPath -> Configure BuildPathをクリックすると、Java Build Pathのウィンドウが表示されるので、このウィンドウのLibrariesタブのAdd JARsボタンから追加できます。)

実行時にVMの引数に次の行を追加して実行します。
-javaagent:[SizeOf.jarのファイルパス]
私の場合は、プロジェクト/lib/SizeOf.jarに入れているので以下のようになります。
-javaagent:./lib/SizeOf.jar
(eclipseでVMの引数を設定する場合は、Run -> Run Configurationsを開き、ArgumentsタブのVM arguments項目に引数を入力します。)

以下に、サンプルのソースコードを載せておきます。
import net.sourceforge.sizeof.SizeOf;

public class SizeOfTester {
 public static void main(String[] args) {
     String str = "String";
     SizeOf.skipStaticField(true); // 初期化コード
     SizeOf.setMinSizeToLog(10); // 初期化コード
     long size = SizeOf.deepSizeOf(str); // オブジェクトのサイズを取得
     System.out.println(size);
    }
}

2. ライブラリ「Classmexer」を利用する
http://www.javamex.com/classmexer/

使い方
上のリンクから、classmexer.jarをダウンロードし、BuildPathを通します。
実行時にVMの引数に次の行を追加して実行します。
-javaagent:[classmexer.jarのファイルパス]

以下に、サンプルのソースコードを載せておきます。
import com.javamex.classmexer.MemoryUtil;

public class ClassmexerTester {
 
    public static void main(String[] args) {
     String str = "String";
     long size = MemoryUtil.deepMemoryUsageOf(str); // オブジェクトのサイズを取得
     System.out.println(size);
    }
}


0 件のコメント:

コメントを投稿