1

特定の状態で現在のヒープを取得するために、JVMTI API ( http://docs.oracle.com/javase/6/docs/platform/jvmti/jvmti.html ) を見ています。

これを行うには、jvmtiHeapCallbacksへのポインタを引数として取るFollowReferences ( http://docs.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#FollowReferences ) メソッドを使用したいと思います。いくつかのコールバック、特にヒープ参照コールバックを定義する構造。

このコールバックは、次の形式にする必要があります。

    typedef jint (JNICALL *jvmtiHeapReferenceCallback)
                 (jvmtiHeapReferenceKind reference_kind, 
                  const jvmtiHeapReferenceInfo* reference_info, 
                  jlong class_tag, 
                  jlong referrer_class_tag, 
                  jlong size, 
                  jlong* tag_ptr, 
                  jlong* referrer_tag_ptr, 
                  jint length, 
                  void* user_data);

class_tag の使い方がわかりません。API で、class_tag を jclass に変換する機能を見つけることができませんでした。いくつかの例を見てきましたが、class_tag を使用できませんでした。

API には SetTag 関数と GetTag 関数がありますが、それらは jclass ではなく jobject 用のようです。

4

1 に答える 1

0

class_tag は、実際のクラス オブジェクトのタグです (クラスは、他のオブジェクトと同様に SetTag でタグ付けできます)。そのため、class_tag で jvmti#GetObjectsWithTag を使用して実際のクラスを取得できます。クラスがタグ付けされていない場合、class_tag はゼロになります。ただし、referrer_tag_ptr で GetObjectsWithTag を使用してから、jni の GetObjectClass メソッドを使用すると、クラス オブジェクトを取得できます。

(少なくとも私が見たほとんどの実装では) GetObjectsWithTag はかなり遅いことに注意してください。速度が問題になる場合は、バッチ処理して一度に多数のオブジェクトを要求することで、パフォーマンスを向上させることができます (GetObjectsWithTag は、タグでいっぱいのバッファーへのポインターを取得します)。

于 2013-05-29T02:13:45.827 に答える