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";
}