先日の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さんの測定方法ではやはり誤差が出ているのも確かだ。これはどうして存在するのかも良く考えないといけないのかもしれない。