【问题标题】:Thread dump containing threads in RUNNABLE state with no stack线程转储包含处于 RUNNABLE 状态且没有堆栈的线程
【发布时间】:2015-09-20 11:40:59
【问题描述】:

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

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

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

应用程序正在运行:

  • JBoss 7
  • Java 7u75
  • 红帽 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)

【问题讨论】:

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


    【解决方案1】:

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

    -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=XXXXXXX

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

    【讨论】:

      【解决方案2】:

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

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

      有关连接池和保持活动的更多信息,请参见 John Skeet 的回答:https://stackoverflow.com/a/10379348/91866

      【讨论】:

      • 我认为AJP Executor连接池中的空闲线程没有这种stacktrace
      • 您发布了堆栈跟踪吗?您发布了您拥有的线程的转储。空闲线程还没有堆栈跟踪,所以不确定你在找什么。鉴于您的问题,我的回答是否不准确?您列出的线程是一个空闲的 ajp 执行程序线程,根据您的配置,您会看到很多线程。如果您希望有人只是对您的性能问题进行分类,那么您的问题非常不清楚,并且可能不会在 StackOverflow 上得到回答。
      • 首先感谢您的回答。然后很抱歉,但在我的问题中,我从线程转储中发布了一个堆栈跟踪。我向你确认这不是一个空闲线程。我发布了问题,因为经过一段时间的调查我真的不知道,然后我自己找到并分享了答案。无论如何,再次感谢,很抱歉第一次没有这么说。
      • 我对你的答案投了反对票,因为在这种特殊情况下对我来说是错误的,但我对你的一些对我来说看起来不错的答案投了赞成票。祝你有美好的一天
      猜你喜欢
      • 2018-12-31
      • 1970-01-01
      • 2010-09-09
      • 2017-06-27
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      相关资源
      最近更新 更多