Usually, during performance troubleshooting in enterprise applications, we take frequent thread dumps for analysis. If there is no useful information, we can perform complete thread monitoring (that is, profiling) as part of our application profiling.
The main reason we start with thread dumps is because obtaining thread dumps is easier and does not require any agent to be attached to the application server.
If we understand the thread dump structure well, we are able to make the best use of it. The following is the basic structure of the standard JVM thread dump: