Thread-Dumps lesen
Jeder Thread-Dump beginnt mit einem Zeitstempel, wenn der Schnappschuss gesammelt wird:
Full thread dump taken at Thu Aug 1 07:19:59 EDT 2019
JVM-Thread-Dumps zeigen den Aufrufstapel an, der an allen Serveroperationen beteiligt ist, die in einem bestimmten Thread ausgeführt werden. Ein Aufrufstapel gibt keinen Fehler auf dem Server an, obwohl ein häufiger Fehler auch einen Aufrufstapel anzeigt. Ein Aufrufstapel zeigt in umgekehrter Reihenfolge an, wie bestimmte Methoden aufgerufen wurden. Siehe das folgende Beispiel:
"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)

In der Aufrufliste wird das Support-Untersystem verwendet, um Thread-Informationen abzurufen. Die Methode dumpAllStacks ruft die Methode dumpThreadInfo auf, die die Thread-Informationen von der integrierten Java-Plattform anfordert.
Der Name des Dienstes, der diese Java-Klassen aufruft, wird im Allgemeinen unter dem Aufrufstapel aufgeführt. In diesem Fall wird der Dienst DumpAllThreads als Teil des Aufrufstapels aufgeführt. Die Methode processService ruft immer die benutzerdefinierten Dienste auf. Wenn Sie nach Diensten suchen, die nach processService im Aufrufstapel aufgeführt sind, können Sie den Thread abrufen, für den ein bestimmter Dienst ausgeführt wird.
Ein Thread hat die folgenden Status:
RUNNABLE – Guter Status. Gibt an, dass der Thread über alle Ressourcen verfügt, die er zum Durchführen der Operationen benötigt.
BLOCKED – Gibt an, dass der Thread auf ein Objekt in einem anderen Thread wartet, bevor er die Operation abschließen kann.
TIME_WAITING – Gibt an, dass der Thread entweder auf einen Synchronisator wartet, um auf eine Ressource zuzugreifen, oder auf eine zusätzliche Eingabe (ähnlich wie beim Status WAITING).
WAITING – Gibt an, dass Threads nicht arbeiten. Wartet auf weitere Eingaben. Dies ist der Standard-Normalzustand für 99 % der Threads in einer Erfassung.
* 
Wenn Sie die Ausgabe mit dem Java-Befehl jstack anstelle des Untersystems für Support sammeln, werden viele Threads im Status BLOCKED angezeigt. Die Threads befinden sich jedoch im Status TIME_WAITING. Dies kann der Standardstatus für einige Thread-Typen sein. Um dies zu vermeiden, führen Sie den Befehl jstack als sudo -u <tomcatUser> jstack <pid> aus.
War dies hilfreich?