包含处于RUNNABLE状态且没有堆栈的线程的线程转储

时间:2015-07-02 19:32:12

标签: java multithreading performance jboss7.x virtual-machine

使用CPU在高负载的应用程序上进行线程转储,我看到很多线程处于这种状态:

  

“ajp-executor-threads - XXXXXX”prio = 10 tid = 0x00002b04b8b33801 nid = 0x5327 runnable [0x0000000000000000]      java.lang.Thread.State:RUNNABLE

对我来说真正奇怪的是,根本没有堆栈跟踪,并且ajp-thread的总数高于 max-threads (下方)已配置

正在运行的应用程序正在进行:

  • JBoss 7
  • Java 7u75
  • Redhat 5.11
  • 在VMWare Enterprise / vSphere 5.5上运行

执行者的配置是:

 <subsystem xmlns="urn:jboss:domain:threads:1.1">
        <bounded-queue-thread-pool name="ajp-executor">
            <core-threads count="32"/>
            <queue-length count="1"/>
            <max-threads count="300"/>
            <keepalive-time time="5" unit="seconds"/>
        </bounded-queue-thread-pool>
    </subsystem>

请注意,此主机上的负载非常高:

  • CPU达到70%

  • 加载时间为4(== vCPU数量)

请注意,这些线程不是空闲线程,因为空闲线程具有此堆栈跟踪:

 "Reference Handler" daemon prio=5 tid=0x00007f92cb00e800 nid=0x3703 in Object.wait() [0x000000012057e000]
     java.lang.Thread.State: WAITING (on object monitor)
     at java.lang.Object.wait(Native Method)
     - waiting on <0x00000007aaa84470> (a java.lang.ref.Reference$Lock)
     at java.lang.Object.wait(Object.java:503)
     at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
     - locked <0x00000007aaa84470> (a java.lang.ref.Reference$Lock)

2 个答案:

答案 0 :(得分:1)

经过进一步分析后,我发现该问题是由于通过以下方式启用远程调试:

  

-Xrunjdwp:运输= dt_socket,服务器= Y,暂停= n时,地址= XXXXXXX

这解释了线程转储中这些奇怪的空堆栈跟踪。

答案 1 :(得分:-3)

这些是AJP执行程序连接池中的空闲线程。您已将核心线程设置为32,这意味着池将始终在连接池中维护32个线程,尽管它们可能处于空闲状态。使用您的配置,您最多可以看到300个线程,但是超过32个线程的任何线程只会在死亡之前等待5秒并从连接池中删除。

至于你的CPU负载,我怀疑它与这些空闲连接池线程有任何关系。

请参阅John Skeet的答案,了解有关连接池的更多信息并保持活力:https://stackoverflow.com/a/10379348/91866