JVMTI代理永远不会返回已终止的线程状态

时间:2011-04-22 01:30:19

标签: java jvmti

实现JVMTI代理,我读取某些事件的线程状态,例如ThreadStart,ThreadEnd,VMInit,VMDeath等。但是,我注意到,线程状态永远不会是新的或终止,但总是可运行,等待,等

可能有一个原因,ThreadEnd只是一个线程正在终止的信号。我阅读了GetAllThreads的所有帖子,其中写着:

  

获取所有直播主题。线程是Java编程语言线程;也就是说,附加到VM的线程。如果java.lang.Thread.isAlive()返回true,则线程处于活动状态,即线程已经启动但尚未死亡。线程范围由JVM TI环境的上下文决定,该环境​​通常是连接到VM的所有线程。请注意,这包括JVM TI代理线程(请参阅RunAgentThread)。

这意味着,即使我在VMDeath事件中调用它,我仍然不会获取已终止的线程。但我是否应该这样做才能使州终止

我的猜测:

  • 在事件ThreadEnd上,我返回手动终止的状态
  • 关于对象分配,如果它是一个线程,我手动返回状态

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

0 个答案:

没有答案