我正在尝试分析从我的 tomcat 服务器获取的线程转储。其中一个线程转储是在正常运行几分钟后进行的,显示一个大约 70 个线程池,其中几个处于 WAITING 状态。我把一个脚本留在了服务器上一夜之间,当我早上又进行了一次线程转储时。在比较两个转储时,我可以看到线程池已从 70 个线程增加到 90 个线程。我还可以看到相同的线程在一个转储和另一个转储之间处于 WAITING 状态,同时添加了 20 个新线程。这是否表明我的应用程序中存在一些错误或者这是标准行为?我想知道为什么等待中的线程没有被重新使用,而是创建了新线程。
例如,从我最初的线程转储中,我看到:
"http-8000-40" - Thread t@74
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Native Method)
- waiting on <4fd24389> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
at java.lang.Thread.run(Thread.java:662)
Locked ownable synchronizers:
- None
然后我可以在第二天早上的转储中看到相同的线程处于相同的状态并等待相同的对象:(我从“<>”中的数字假设这一点)
"http-8000-40" - Thread t@74
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Native Method)
- waiting on <4fd24389> (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484)
at java.lang.Thread.run(Thread.java:662)
Locked ownable synchronizers:
- None