1

实现 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";
        }
4

0 回答 0