1

我正在查看 JVMTI API(http://docs.oracle.com/javase/6/docs/platform/jvmti/jvmti.html),以便在给定状态下获取当前堆。

为了做到这一点,我想使用 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 中,我找不到将 class_tag 转换为 jclass 的函数。我查看了几个示例,但无法使用 class_tag。

在 API 中,有一个 SetTag 和 GetTag 函数,但它们似乎是针对 jobject 而不是针对 jclass。

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 回答