Javaのオブジェクトサイズの測定とか

Javaのオブジェクトサイズの測り方、sizeof - minghaiの日記で紹介されてました。下の2サイトで、コードつきで紹介されてたので確認してみることに。

まず下のサイトのほうがコードがシンプルだったのでそっちから。SunのWindowsJava 1.4.2ではこんな感じ。

$ java SizeOf
SizeOf: (bytes)
Object: 8

ちなみに下のサイト、Factoryパターンでobjectを作ってるんだけど、それは自分で実装しろということらしい。めんどくさ・・・。とりあえず適当に作る。

class LangObjectFactory implements ObjectFactory{
  public String getClassName(){return "Object";}
  public Object makeObject(int i){return new Object();}
  public int makeHowMany(){return 100000;}
}

Windows版はいいのですよ。これを某ベンダーの某OSにもっていくと・・・

Java 1.4.2

# java SizeOf
SizeOf: (bytes)
Object: 15

Java 1.5

# java5 SizeOf
SizeOf: (bytes)
Object: -5

うううーん。15って・・・きり悪すぎだろ。あと、Java5の結果はマイナスになってるとかひどい・・・!上のサイトはコードが長い分、この環境でも正確に測定してくれました。

Java 1.4.2

# java Sizeof
'before' heap: 1537720, 'after' heap: 3176520
heap delta: 1638800, {class java.lang.Object} size = 16 bytes

Java 1.5

# java5 Sizeof
'before' heap: 1039152, 'after' heap: 2639152
heap delta: 1600000, {class java.lang.Object} size = 16 bytes

Java5のほうがキレイにサイズがでるのね。GCの挙動が違うからかしら?