Чтение дампов потоков
Каждый дамп потока начинается с метки времени сбора снимка:
Full thread dump taken at Thu Aug 1 07:19:59 EDT 2019
Дампы потоков JVM отображают стек вызовов, включенный в любые операции сервера, выполняемые в определенном потоке. Стек вызовов не указывает на ошибки на сервере, хотя часто встречающиеся ошибки также отображают стек вызовов. Стек вызовов показывает в обратном порядке, как осуществлялся вызов определенных методов. См. следующий пример.
"http-nio-8080-exec-8" tid=0x114 in RUNNABLE
Blocked: 32[-1ms], Waited: 99[-1ms]
User CPU: 109ms
- synchronizer <0x4206a205> (a java.util.concurrent.ThreadPoolExecutor$Worker)
at sun.management.ThreadImpl.dumpThreads0(Native Method)
at sun.management.ThreadImpl.dumpAllThreads(Unknown Source)
at com.thingworx.support.utilities.Stacktrace.dumpThreadInfo(Stacktrace.java:70)
at com.thingworx.support.utilities.Stacktrace.dumpAllStacks(Stacktrace.java:64)
- locked <0x4cdd9461> (a java.lang.Class)
at com.thingworx.support.utilities.Stacktrace.dumpAllStacks(Stacktrace.java:38)
- locked <0x4cdd9461> (a java.lang.Class)
at com.thingworx.support.utilities.SupportToolsTemplate.DumpAllThreads(SupportToolsTemplate.java:202)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.thingworx.common.processors.ReflectionProcessor.processService(ReflectionProcessor.java:261)
at com.thingworx.handlers.ReflectionServiceHandler.processService(ReflectionServiceHandler.java:50)
at com.thingworx.things.Thing.processServiceRequestDirect(Thing.java:7886)
at com.thingworx.things.Thing.processAPIServiceRequest(Thing.java:7824)
at com.thingworx.webservices.BaseService.handleInvoke(BaseService.java:3077)
at com.thingworx.webservices.BaseService.service(BaseService.java:356)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)

В стеке вызовов подсистема поддержки используется для получения информации о потоке. Метод dumpAllStacks вызывает метод dumpThreadInfo, который запрашивает информацию о потоках из встроенной платформы Java.
Наименование сервиса, вызывающего эти Java-классы, обычно указано под стеком вызовов. В данном случае как часть стека вызовов указан сервис DumpAllThreads. Метод processService всегда вызывает пользовательские сервисы. Проверка на наличие сервисов, перечисленных после processService в стеке вызовов, позволяет получить поток, в котором выполнялся определенный сервис.
Поток имеет следующие состояния.
RUNNABLE - хорошее состояние. Указывает, что поток имеет все ресурсы, необходимые для выполнения операций.
BLOCKED - указывает, что поток ожидает объекта из другого потока, чтобы можно было завершить операцию.
TIME_WAITING - указывает, что поток ожидает синхронизатора для доступа к ресурсу или дополнительных входных данных (подобно состоянию ОЖИДАНИЕ)
WAITING - указывает, что в данный момент поток не выполняет никакую работу. Он ожидает дополнительных входных данных. Это нормальное состояние по умолчанию для 99 % потоков в записи.
* 
При сборе выходных данных с использованием команды Java jstack вместо подсистемы поддержки многие потоки отображаются в состоянии BLOCKED. Однако эти потоки находятся в состоянии TIME_WAITING. Это может быть состояние по умолчанию для некоторых типов потоков. Чтобы избежать этого, выполните команду jstack с параметрами sudo -u <ПользовательTomcat> jstack <pid>.
Было ли это полезно?