2013-04-04 16 views
0

我正在查看JVMTI API(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中,我無法找到將class_tag轉換爲jclass的功能。我看了幾個例子,無法獲得class_tag的使用。

在API中,有一個SetTag和GetTag函數,但它們似乎是jobject而不是jclass。

回答

0

class_tag是實際類對象的標籤(類可以使用SetTag標記,就像任何其他對象一樣)。因此,您可以在class_tag上使用jvmti#GetObjectsWithTag獲取實際的類。如果該類沒有被標記,那麼class_tag將爲零。但是,仍然可以通過在referrer_tag_ptr上使用GetObjectsWithTag,然後使用jni GetObjectClass方法來獲取類對象。

請注意(至少在我見過的大多數實現中)GetObjectsWithTag非常慢。如果速度是一個問題,您可以通過批處理並且一次請求一堆對象(GetObjectsWithTag將指針指向充滿標籤的緩衝區)來獲得更好的性能。