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

初めに

 * main()の呼び出しより前に実行されるメソッドを指定できることを利用する
 (premainメソッド)

作成手順

 [1] Eclipseで、サンプルの「ObjectSizeFetcher.java」を参考にプログラムを書く
 [2] Eclipseで、「build.xml」を作成する(内容はサンプルの「build.xml」を参照のこと)
 [3] 手順[2] で作成した「build.xml」を右クリックし、[Run As]-[Ant Build]を選択
  ⇒すると、ビルドが成功すれば「lib」直下に「ObjectSizeFetcher.jar」ができるはず。
 [4] メモリを測るクラス(呼び出し先)を作成
  (内容はサンプルの「SampleMain.java」を参照のこと)
 [5] 手順[2] で作成した「SampleMain.java」を右クリックし、
     [Run As]-[Run Configurations]を選択
 [6] 「Arguments」タブの「VM arguments」項目に
   「-javaagent:./lib/ObjectSizeFetcher.jar」を入力
 [7] 「Run」ボタン押下で、クラスを実行する

サンプル

ObjectSizeFetcher.java

http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object
より
package com.sample;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        System.out.println("premain");
        ObjectSizeFetcher.instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        System.out.println("getObjectSize");
        return ObjectSizeFetcher.instrumentation.getObjectSize(o);
    }
}

build.xml

http://www.ne.jp/asahi/hishidama/home/tech/java/javassist.html#h2_PreMain
を参考に作成
<?xml version="1.0" encoding="UTF-8"?>
<project name="HelloWorld" default="make_ObjectSizeFetcher_jar" basedir=".">
   <target name="make_ObjectSizeFetcher_jar">
      <jar jarfile="./lib/ObjectSizeFetcher.jar">
         <manifest>
            <attribute name="Premain-Class" value="com.sample.ObjectSizeFetcher" />
         </manifest>
      </jar>
   </target>
</project>

SampleMain.java

* 実行するクラス
package com.sample;

import com.sample.ObjectSizeFetcher;

public class SampleMain {

   public static void main(String[] args) {
      String str = "Mike";
      System.out.println(ObjectSizeFetcher.getObjectSize(str));
   }
}

出力結果

premain
getObjectSize
24


関連記事

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

https://blogs.yahoo.co.jp/dk521123/32941391.html

JavaJVMのメモリ情報を出力させる

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