2013-04-04 6 views
0

Я просматриваю API JVMTI (http://docs.oracle.com/javase/6/docs/platform/jvmti/jvmti.html), чтобы получить текущую кучу в заданном состоянии.jvmti: как использовать class_tag

Для этого я хотел бы использовать метод FollowReferences (http://docs.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#FollowReferences), который принимает в качестве аргумента указатель на структуру jvmtiHeapCallbacks, которая определяет несколько обратных вызовов и, в частности, обратный вызов ссылки на кучу.

Этот обратный вызов должен иметь следующий вид:

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 я не могу найти fonction, преобразующий class_tag в jclass. Я просмотрел несколько примеров и не смог получить использование class_tag.

В API есть функции SetTag и GetTag, но они, похоже, предназначены для jobject, а не для jclass.

ответ

0

Класс_tag является тегом фактического объекта класса (классы могут быть помечены SetTag, как и любой другой объект). Итак, вы можете получить фактический класс с jvmti # GetObjectsWithTag в class_tag. Если класс не был помечен, то class_tag будет равен нулю. Однако вы все равно можете получить объект класса с помощью GetObjectsWithTag на referrer_tag_ptr, а затем с помощью метода jni GetObjectClass.

Обратите внимание, что (по крайней мере, на большинстве реализаций, которые я видел) GetObjectsWithTag довольно медленный. Если скорость является проблемой, вы получите лучшую преформацию, выбирая ее и запрашивая сразу несколько объектов (GetObjectsWithTag берет указатель на буфер, полный тегов).