Агент JVMTI никогда не возвращает состояние потока прекращено - PullRequest
1 голос
/ 22 апреля 2011

Реализуя агент JVMTI, я читаю состояние потоков при определенных событиях, например, ThreadStart, ThreadEnd, VMInit, VMDeath и т. Д. Однако я заметил, что состояние потоков никогда не является новым или прекращенным, но всегда выполняется, подождитеи т. д.

Возможно, причина в том, что ThreadEnd - это всего лишь сигнал о завершении потока.Я читаю все темы с GetAllThreads, который говорит:

Получить все живые темы.Потоки являются потоками языка программирования Java;то есть потоки, которые присоединены к виртуальной машине.Поток активен, если java.lang.Thread.isAlive () вернул бы true, то есть поток был запущен и еще не умер.Множество потоков определяется контекстом среды TI JVM, которой обычно являются все потоки, подключенные к виртуальной машине.Обратите внимание, что это включает потоки агента TI JVM (см. RunAgentThread).

Это означает, что даже если я вызову это в событии VMDeath, я все равно не получу завершенные потоки.Но я должен сделать, чтобы получить состояния прекращено и new ?

Мое предположение:

  • для события ThreadEnd, Я возвращаю состояние, завершившееся вручную
  • при выделении объекта, если это поток, я возвращаю новое состояние вручную

PS: я читаю состояние потоков в соответствии с предложением JVMTIAPI

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