6

現在、Java 1.7 用のネイティブ JVMTI エージェントを構築しています。問題は、特定の Java オブジェクト インスタンスに関するデータのインデックスを作成する必要があることです。私の質問は、jobject 型の値をオブジェクトのインスタンス ID として使用して、インデックス付きデータを取得できますか?

jobject タイプのセマンティクスについての情報を探しています。オブジェクトのメモリ位置へのポインタですか? スタックポインタアドレスですか?JVMの内部構造へのアドレスですか?したがって、jobject の値が一意であり、Java オブジェクトの寿命に沿って不変であるかどうかはわかりません。

ご協力いただきありがとうございます。

編集

ここにあるJNIの仕様によると、jobjectはオブジェクトのインスタンスへのポインタのようです。

4

2 に答える 2

2

「jobject 型の値」と言うときは、toStringによって返される値を意味していると思います。Java doc を見ると、次のように記載されています。

クラス Object の toString メソッドは、オブジェクトがインスタンスであるクラスの名前、アットマーク文字 `@'、およびオブジェクトのハッシュ コードの符号なし 16 進数表現で構成される文字列を返します。つまり、このメソッドは次の値に等しい文字列を返します。

    getClass().getName() + '@' + Integer.toHexString(hashCode())

また、 hashCodeメソッドの Java doc を見ると、次のように記載されています。

Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、hashCode メソッドは一貫して同じ整数を返す必要があります。

そしてまた

合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は JavaTM プログラミング言語では必要ありません。)

更新: Ryan のコメントへの応答: System.identityHashCodeは、hashcode メソッドがオーバーライドされている場合でも、元のハッシュ コードを取得します。ただし、同様のコメントは、それが本当にユニークではないことに注意してください。

したがって、あなたの質問に対する答えはイエスであり、不変であり、一意である可能性が非常に高いと思いますが、JVM のドキュメントまたはソース コードを読む必要があります。

于 2012-03-10T00:27:33.753 に答える
1

少なくとも HotSpot では、jobject は確かにオブジェクトの場所へのポインターです。つまり、それを逆参照すると、各オブジェクトに一意のアドレスが得られます。これは、あなたが求める「一意で不変の ID」の半分です。問題は、HotSpot がオブジェクトを移動できるため、ガベージ コレクション中にアドレスが変更される可能性があることです。

JVMTI の GetTag および SetTag 関数は、オブジェクトの場所からタグまでのハッシュ テーブルを内部的に使用します。HotSpot は、オブジェクトが移動するたびにこのハッシュ テーブルを更新します。これは、JVMTI エージェントの位置から簡単に複製することはできません。あなたがすでに行っていると言うように、タグを使用して独自の一意の ID 値を割り当てることが、おそらくここに行く唯一の方法です。

于 2013-02-23T19:39:40.187 に答える