Реализуя агент 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";
}