1

JVMTI エージェントを実装して、特定のイベント (ThreadStart、ThreadEnd、VMInit、VMDeath など) でスレッドの状態を読み取りました。

理由があるかもしれません.ThreadEndは、スレッドが終了していることを示す単なるシグナルです. 私は言うすべてのスレッドを読みましGetAllThreadsた:

すべてのライブ スレッドを取得します。スレッドは Java プログラミング言語のスレッドです。つまり、VM に接続されているスレッドです。java.lang.Thread.isAlive() が true を返す場合、つまり、スレッドが開始され、まだ終了していない場合、スレッドはライブです。スレッドの範囲は、JVM TI 環境のコンテキストによって決まります。これは通常、VM に接続されたすべてのスレッドです。これには、JVM TI エージェント スレッドが含まれることに注意してください (RunAgentThread を参照)。

つまり、VMDeath イベントでこれを呼び出しても、終了したスレッドはフェッチされません。しかし、状態を終了して新しいものにするために私はやるべきですか?

私の推測:

  • イベント ThreadEnd で、手動で終了した状態を返します
  • オブジェクトの割り当て時に、それがスレッドの場合、手動で新しい状態を返します

PS: JVMTI API で提案されているように、スレッドの状態を読み取っています。

        err = (*jvmti)->GetThreadState(jvmti, thread, &state);
        abortOnError(err);
        switch (state & JVMTI_JAVA_LANG_THREAD_STATE_MASK) {
        case JVMTI_JAVA_LANG_THREAD_STATE_NEW:
          return "NEW";
        case JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED:
          return "TERMINATED";
        case JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE:
          return "RUNNABLE";
        case JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED:
          return "BLOCKED";
        case JVMTI_JAVA_LANG_THREAD_STATE_WAITING:
          return "WAITING";
        case JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING:
          return "TIMED_WAITING";
        }
4

0 に答える 0