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

初めに

 * 以下の関連記事にある
  java.lang.insturument.InstrumentationのgetObjectSizeが
  クラスのネストには対応してないようなので、
  別の方法でJavaにおけるオブジェクトの使用メモリサイズを測る。
http://blogs.yahoo.co.jp/dk521123/32945695.html

[1] ライブラリ「sizeOf」を利用する

設定方法

[1] 以下のサイトからライブラリ「sizeOf」をダウンロードし、Zipを解凍する
http://sourceforge.net/projects/sizeof
[2] Eclipseを立ち上げ、任意のプロジェクトの配下に「lib」を作成し、
    その下にダウンロードした「SizeOf.jar」を配置しておく

[3] プロジェクトを右クリックして、[BuildPath]-[Configure BuildPath]を
     クリックすると、「Java Build Path」のウィンドウが表示されるので、
    このウィンドウの「Libraries」タブの「Add JARs」ボタンから
    [2]の「SizeOf.jar」を追加

[4] [Run]-[Run Configurations]を開き、「Arguments」タブの「VM arguments」項目に
    「-javaagent:./lib/SizeOf.jar」を入力

サンプル

import net.sourceforge.sizeof.SizeOf;

public class HelloWorld {

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

出力結果

JAVAGENT: call premain instrumentation for class SizeOf
Found big object:   [C@2228437 size: 24.0b
Found big object: java.lang.String@27291192 size: 48.0b
Tom = 48
Found big object:   [C@3299256 size: 24.0b
Found big object: java.lang.String@20843194 size: 48.0b
Kevin = 48

[2] ライブラリ「Classmexer」を利用する

設定方法

 「SizeOf」と同じなので、省略。以下はダウンロードサイト
http://www.javamex.com/classmexer/

サンプル

import com.javamex.classmexer.MemoryUtil;

public class HelloWorld {

   public static void main(String[] args) {
      String str = "Tom";

      // オブジェクトのサイズを取得
      long size = MemoryUtil.deepMemoryUsageOf(str);
      System.out.println("Tom = " + size);

      str = "Kevin";
      size = MemoryUtil.deepMemoryUsageOf(str);
      System.out.println("Kevin = " + size);
   }
}

出力結果

JAVAGENT: call premain instrumentation for class SizeOf
Tom = 48
Kevin = 48


関連記事

Instruction の getObjectSize で、オブジェクトの使用メモリサイズを測る

http://blogs.yahoo.co.jp/dk521123/32945695.html

メモリ情報をプログラム中に埋め込む

http://blogs.yahoo.co.jp/dk521123/33278121.html