스레드 덤프 읽기
각 스레드 덤프는 스냅샷이 수집될 때 타임스탬프로 시작됩니다.
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)

호출 스택에서 Support Tool 확장 메서드를 사용하여 스레드 정보를 가져옵니다. dumpAllStacks 메소드는 기본 제공 Java 플랫폼에서 스레드 정보를 요청하는 dumpThreadInfo 메소드를 호출합니다.
이러한 Java 클래스를 호출하는 서비스의 이름은 일반적으로 호출 스택 아래에 나열됩니다. 이 경우 DumpAllThreads 서비스는 호출 스택의 일부로 나열됩니다. 이 processService 메소드는 항상 사용자 정의 서비스를 호출합니다. 호출 스택의 processService 뒤에 나열된 서비스를 확인하면 특정 서비스가 실행되는 스레드를 가져올 수 있습니다.
스레드의 상태는 다음과 같습니다.
RUNNABLE - 양호한 상태입니다. 이는 스레드에 작업을 수행하는 데 필요한 모든 리소스가 있음을 나타냅니다.
BLOCKED - 작업을 완료하기 전에 스레드가 다른 스레드의 객체를 대기하고 있음을 나타냅니다.
TIME_WAITING - 스레드가 동기화 프로그램이 리소스에 액세스하는 동안 대기 중이거나 일부 추가 입력(WAITING 상태와 유사)을 대기 중임을 나타냅니다.
WAITING - 스레드가 아무런 작업을 수행하지 않음을 나타냅니다. 추가 입력을 대기하는 중입니다. 이는 캡처에 있는 스레드의 99%에 대한 기본 정상 상태입니다.
* 
Support Tool 확장 프로그램 대신 Java jstack 명령을 사용하여 출력을 수집하는 경우 많은 스레드가 BLOCKED 상태로 표시됩니다. 그러나 스레드는 TIME_WAITING 상태입니다. 이는 일부 유형의 스레드에 대한 기본 상태일 수 있습니다. 그렇게 되지 않도록 하려면 jstack 명령을 sudo -u <tomcatUser> jstack <pid>로 실행합니다.