2012-03-25 7 views
1

jvmがいくつかのJavaオブジェクトを割り当てるときにコールバックを得ることはできますか?ここで私はやっているものです:jvmtiオブジェクト割り付けのコールバック動作に困惑しました

static jvmtiCapabilities capa; 
static jvmtiEnv*   jvmti     = NULL; 
static const char*   fileName    = "C:\\temp\\ObjectInitCallbackDump.txt"; 
static ofstream    outFileStream; 

void JNICALL callbackObjectAllocation (jvmtiEnv* jvmti_env, 
             JNIEnv*  jni_env, 
             jthread  thread, 
             jobject  object, 
             jclass  object_klass, 
             jlong  size   ) 
{ 
    char*  generic_ptr_class; 
    char*  class_name; 
    jvmtiError error; 

    error = jvmti_env->GetClassSignature(object_klass, &class_name, &generic_ptr_class); 
    if (check_jvmti_error(jvmti_env, error, "Failed to get class signature")) { 
     return; 
    } 
    outFileStream << class_name << std::endl; 
} 

JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) { 
    jint    result; 
    jvmtiError   error; 
    jvmtiEventCallbacks callbacks; 

    outFileStream.open(fileName,ios::trunc); 

    result = jvm->GetEnv((void**) &jvmti, JVMTI_VERSION_1_1); 
    if (result != JNI_OK || jvmti == NULL) { 
     printf("error\n"); 
     return JNI_ERR; 
    } else { 
     printf("loaded agent\n"); 
    } 

    (void) memset(&capa, 0, sizeof(jvmtiCapabilities)); 
    capa.can_generate_vm_object_alloc_events  = 1; 

    error = jvmti->AddCapabilities(&capa); 
    if (check_jvmti_error(jvmti, error, "Unable to set capabilities") != JNI_OK) { 
     return JNI_ERR; 
    } 

    (void) memset(&callbacks, 0, sizeof(callbacks)); 
    callbacks.VMObjectAlloc   = &callbackObjectAllocation; 

    error = jvmti->SetEventCallbacks(&callbacks, (jint) sizeof(callbacks)); 
    if (check_jvmti_error(jvmti, error, "Unable to set callbacks") != JNI_OK) { 
     return JNI_ERR; 
    } 

    error = jvmti->SetEventNotificationMode( JVMTI_ENABLE, 
               JVMTI_EVENT_VM_OBJECT_ALLOC, 
               (jthread) NULL); 
    if (check_jvmti_error(jvmti, error, 
      "Unable to set method entry notifications") != JNI_OK) { 
     return JNI_ERR; 
    } 

    return JNI_OK; 
} 

JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm) { 
    outFileStream.close(); 
} 

私は私が作成したファイルを確認すると、私は彼らがそこにいることを知っているとNetBeansは私に語ったが、正確に一つのインスタンスがあり、私が興味を持っていたクラスが表示されませんそのクラスのjvmで何かご意見は???

ニキータ

答えて

8

、JVMTIはJVMTI VMObjectAllocで説明したように、バイトコード(BCI)を介して検出することができないオブジェクトの割り当てイベントをサポートしていますイベントのドキュメンテーション。つまり、ほとんどのオブジェクト割り当てではイベントがトリガーされません。私はあなたが欠けている配分がそのカテゴリに入ると仮定します。

幸いにも、BCIを使用してすべてのオブジェクト割り当てを傍受することは、あまりにも難しくありません。 HeapTrackerのデモでは、イベントとVMObjectAllocイベントを使用して、JVMTIエージェント内のすべてのオブジェクト割り当てをインターセプトする方法を正確に示しています。

0

多分あなたはあなたの小切手を打っていませんか? これが実際に実行するコードであれば、バグがあります。あなたはそれを逃した。あなたが比較対象 の最後に、次のようにする必要があります:パフォーマンス上の理由から

if (strcmp(class_name,"Ljavax/swing/JFrame;") == 0) { 
    printf("Got the sucker!!!"); 
} 
+0

実際には、指定された文字列のサブ文字列を検索する別の関数を使用していますが、戦略を変更してcallbackObjectAllocationで抽出できるすべてのクラス記述子をテキストファイルにダンプしてからそのファイルを調べました。私は数十万のクラスを持つ4MBのテキストのようなものだが、私が興味を持っているものはどれも、画面上ではっきりと見るものの、それはない。だから、私は完全に困惑しています。なぜなら、割り当てによってこのイベントが発生し、他のものがそれを引き起こさないようにするために、いくつかのオブジェクトを特別にするものです。何かご意見は? –

+0

私はリストをより代表的な例に更新しました。誰かが助けることを願っています。それは私が理解していないそのメカニズムに何かがあることは、私にはほとんど迷惑です。ありがとう –

関連する問題