读取线程转储
每个线程转储均以收集快照的时间戳开始:
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 方法会调用从内置 Java 平台中请求线程信息的 dumpThreadInfo 方法。
调用这些 Java 类的服务的名称通常会在调用堆栈下方列出。在这种情况下,DumpAllThreads 服务会作为调用堆栈的一部分列出。processService 方法始终用于调用自定义服务。检查在调用堆栈中 processService 之后列出的服务,可获得执行特定服务的线程。
线程具有以下状态:
RUNNABLE - 状态良好。指示线程具有执行操作所需的所有资源。
BLOCKED - 指示线程正在等待另一线程中的某个对象,然后才能完成操作。
TIME_WAITING - 指示线程正在等待同步器访问资源,或者正在等待一些附加输入 (类似于 WAITING 状态)
WAITING - 指示线程未执行任何工作。正在等待进一步的输入。这是捕捉中 99% 的线程的默认正常状态。
* 
如果使用 Java jstack 命令而不是 “支持工具”扩展来收集输出,则许多线程会显示为 BLOCKED 状态。但是,线程现处于 TIME_WAITING 状态。这可能是某些类型线程的默认状态。为避免这种情况,请以 sudo -u <tomcatUser> jstack <pid> 身份运行 jstack 命令。