实现JVMTI代理,我读取某些事件的线程状态,例如ThreadStart,ThreadEnd,VMInit,VMDeath等。但是,我注意到,线程状态永远不会是新的或终止,但总是可运行,等待,等
可能有一个原因,ThreadEnd只是一个线程正在终止的信号。我阅读了GetAllThreads
的所有帖子,其中写着:
获取所有直播主题。线程是Java编程语言线程;也就是说,附加到VM的线程。如果java.lang.Thread.isAlive()返回true,则线程处于活动状态,即线程已经启动但尚未死亡。线程范围由JVM TI环境的上下文决定,该环境通常是连接到VM的所有线程。请注意,这包括JVM TI代理线程(请参阅RunAgentThread)。
这意味着,即使我在VMDeath事件中调用它,我仍然不会获取已终止的线程。但我是否应该这样做才能使州终止和新?
我的猜测:
P.S。:我正在按照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";
}