JNI関数に渡される this
オブジェクトのOOP(Ordinary Object Pointer: HotSpot内で扱われるJavaオブジェクトのC++表現)のアドレスを出力します。ここで表示されるアドレスをHSDBのInspector(CLHSDBなら inspect
)に与えることで、OOPの中身を見ることができます。
HotSpotはJNI仕様で 参照型となっているもの はOOPへのポインタに変換してJNI関数へ渡されます。
単純なWide Oopの場合(Compressed Oopでない) JNIHandles::make_local()
を通して oop
のポインタ( `oop*' )がJNI関数へ渡されます。HotSpot内部のそれぞれの型との関係は以下のとおりです(※実際のHotSpotの実装とは違います)。
typedef oop oopDesc*
typedef jobject oop*
※Compressed Oopの場合は narrowOop
になり、 oop
のアドレスがベースアドレスからのオフセットとビットシフトで計算されます。
なお、 HeapStats はJavaオブジェクトの内容を取得するために、上記のようにOOPのポインタを直接たどることでJNI呼び出しのオーバーヘッドを削減しています。
$ export JAVA_HOME
$ make
$ java -Djava.library.path=. OopInspectTest
this object = 0x89a0add8
PID = 540
jhsdb hsdb
でHSDB、または jhsdb clhsdb
でCLHSDBを起動し、サンプルプログラムの this object
で出力されているアドレスをInspectorに入力します。
すると、 this
オブジェクト( OopInspectTest
)のフィールドが参照でき、インスタンスフィールド testField
に設定している文字列 from main()
を確認することができます。