オブジェクトサイズを測ったら驚いた

先日のInstrumentationTestを使ってみた。
IBMの虎のjava.lang.Objectのサイズはなんと12[bytes]だ。
今までSun、IBM両方を計ったが8バイト境界でないのは初めてだ。
ひょっとしてInstrumentation.getObjectSize()は実際に必要なサイズよりも少ない論理値を表示するのだろうか。


あわててVladimirさんの方法で測定してみた結果が次である。

'before' heap: 1015960, 'after' heap: 2615960
heap delta: 1600000, {class java.lang.Object} size = 16 bytes

間違いなく、虎で追加されたgetObjectSize()は必要なヒープ量でなくオブジェクトの論理値しか表示しないようだ。これは少し不便かと思ったがIntelプラットフォームでは8の倍数に繰り上げれば良いだけなのか。しかしC言語で考えずにStructを組むと隙間ができて余分なメモリが必要だった気がする。まさかJavaでもそれが起こりうるのだろうか?

ちなみにSun製のJavaの同じプログラムの実行結果は以下である。

'before' heap: 536472, 'after' heap: 1334648
heap delta: 798176, {class java.lang.Object} size = 8 bytes

たった4バイトの差が、複数のオブジェクト利用になるととんでもない差になるのに驚く。また初期に利用されるヒープの差なども面白い。どちらも全くオプション無しの結果である。
Vladimirさんの測定方法ではやはり誤差が出ているのも確かだ。これはどうして存在するのかも良く考えないといけないのかもしれない。

追記 (2006/07/15)

当時私がダウンロードしたIBMLenovo製品にしかインストールできないJRE50はバグが多かったようで,別にダウンロードしたEclipse3.1.1同梱版JDK5.0ではgetObjectSizeが16ときちんと表示された.今でも両方持っているがJRE版はやはり12と表示してしまう.つまりこれはバグだったようであり,8バイト境界を補正するものが正しい結果なようだ.