我正在尝试分析我从tomcat服务器获取的线程转储。其中一个线程转储是在正常运行时间几分钟后进行的,显示了大约70个线程池,其中几个线程处于等待状态。我让一个脚本在服务器上运行了一整夜,当我在早上进行了另一个线程转储时。当比较两个转储时,我可以看到线程池已经从70个线程增加到90个线程。我还可以看到相同的线程在一个转储和另一个转储之间处于等待状态,同时添加了20个新线程。这是否意味着我的应用程序中有一些bug,或者这是标准行为?我想知道为什么等待中的线程没有被重用,而是创建了新的线程。我假设线程在从一个转储到另一个转储时根本没有被重用,因为在转储文件中,它将它们报告为“正在等待”,而<>中的数字在从一个转储到另一个转储时是相同的,这个假设正确吗?
例如,在我的初始线程转储中,我看到了以下内容:
"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发布于 2013-06-06 22:43:30
Tomcat需要花费一些时间来管理线程和其他资源,即使在webapp的代码完成处理请求之后也是如此。为了跟上负载,如果没有足够的线程可用,Tomcat会分配新的线程。
如果您总共有70个线程和70个并发请求,那么一切都应该很好。如果一个请求(共70个)完成(即客户端已经接收到所有数据),并且在Tomcat完全完成请求处理器线程之前发出了另一个请求,则将分配另一个线程来处理新请求,从而产生一个线程池size=71。
这可能会发生很多次,因为它不是确定性的,因为上下文切换、GC暂停等可能会干扰服务器上发生的所有事情的确切时间。
https://stackoverflow.com/questions/16960957
复制相似问题