【问题标题】:Apache Tomcat Threads in WAITING state while thread pool increasesApache Tomcat 线程处于 WAITING 状态,而线程池增加
【发布时间】:2013-06-06 22:43:29
【问题描述】:

我正在尝试分析从我的 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

【问题讨论】:

    标签: apache tomcat


    【解决方案1】:

    Tomcat 需要花费一些时间来管理线程和其他资源,即使在您的 web 应用程序的代码完成处理请求之后也是如此。为了跟上负载,如果没有足够的可用线程,Tomcat 会分配新的线程。

    如果您有 70 个线程和 70 个并发请求,那么一切都应该很好。如果一个请求(共 70 个)完成(即客户端已收到所有数据)并且在 Tomcat 完全完成请求处理器线程之前发出另一个请求,则将分配另一个线程来处理新请求,从而导致size=71 的线程池。

    这可能会发生很多次,因为它不是确定性的,因为上下文切换、GC 暂停等可能会干扰服务器上发生的所有事情的确切时间。

    【讨论】:

      猜你喜欢
      • 2014-01-31
      • 2018-08-27
      • 1970-01-01
      • 2011-09-18
      • 2012-02-22
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      相关资源
      最近更新 更多