实现 JVMTI 代理,我读取了某些事件的线程状态,例如 ThreadStart、ThreadEnd、VMInit、VMDeath 等。但是,我注意到,线程状态永远不会是新的或终止的,而是始终可运行、等待等。
可能是有原因的,ThreadEnd 只是线程终止的一个信号。我读了所有的线程GetAllThreads
,上面写着:
获取所有实时线程。线程是 Java 编程语言线程;也就是说,附加到 VM 的线程。如果 java.lang.Thread.isAlive() 返回 true,则线程处于活动状态,即线程已启动且尚未终止。线程的范围由 JVM TI 环境的上下文决定,它通常是附加到 VM 的所有线程。请注意,这包括 JVM TI 代理线程(请参阅 RunAgentThread)。
这意味着,即使我在 VMDeath 事件中调用它,我也不会获取已终止的线程。但是我应该这样做以使州终止和新的吗?
我猜:
- 在事件 ThreadEnd 上,我返回手动终止的状态
- 在对象分配上,如果是线程,我手动返回状态 new
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";
}