Почему событие HotSpot ExecutionSample всегда возвращает STATE_RUNNABLE?
По проекту.
Профилировщик методов JFR периодически производит выборку Java потоков и создает события двух типов:
ExecutionSample
, когда состояние потока равно in_java
NativeMethodSample
, когда состояние потока равно in_native
См. jfrThreadSampler. cpp исходный код:
if (JAVA_SAMPLE == type) {
if (thread_state_in_java(thread)) {
ret = sample_thread_in_java(thread, frames, max_frames);
}
} else {
assert(NATIVE_SAMPLE == type, "invariant");
if (thread_state_in_native(thread)) {
ret = sample_thread_in_native(thread, frames, max_frames);
}
}
И in_java
, и in_native
соответствуют STATE_RUNNABLE
в формате JFR.
Когда поток не является работоспособный по любой причине (STATE_SLEEPING
, STATE_PARKED
et c.), его состояние JVM равно thread_blocked
. Однако профилировщик метода JFR вообще не производит выборку заблокированных потоков.
Если вас интересует профилирование настенных часов (т. Е. Выборка всех потоков , независимо от того, работают они на ЦП или в спящем режиме) Вы можете посмотреть asyn c -профиль . Asyn c -profiler также может выводить данные в формате, совместимом с JFR, но в отличие от JFR генерирует события ExecutionSample
как для потоков RUNNABLE, так и для потоков IDLE.