iteye_9831 2013-11-29 11:36 采纳率: 100%
浏览 1849
已采纳

关于JStack中的wait on condition

请教一下 JStack中的wait on condition是什么意思?

我发现,某个线程在jstack中被标识为“wait on condition”时,
下面的线程状态,有时候是:“RUNNABLE”,也有的时候是:“TIMED_WAITING”
至于其他状态,应该也有,只是我只简单看到这两个而已。

[img]http://dl2.iteye.com/upload/attachment/0091/6719/20447b04-a38c-3f75-95e3-92e001d29fb6.png[/img]

那个这个“wait on condition”在jstack中究竟是什么含义呢?
JStack对应的信息在JConsole中一样可以查看。
但是在JConsole中并没有给出“wait on condition”的概念。

[img]http://dl2.iteye.com/upload/attachment/0091/6723/51d8a35c-c558-35da-85a0-34e929416648.png[/img]

另外,jconsole的查看到的线程信息,来源是MBean中的java.lang.management.ThreadMXBean的线程描述信息:
java.lang.management.ThreadInfo
这一点确信无异。(这一点我猜测是JMX通过不同的连接器发布出来的)

[img]http://dl2.iteye.com/upload/attachment/0091/6733/91213646-e913-3d3d-9427-1edbffee119f.png[/img]

  • 写回答

1条回答 默认 最新

  • chainhou 2013-11-29 13:45
    关注

    [quote]该状态出现在线程等待某个条件的发生。具体是什么原因,可以结合 stacktrace来分析。最常见的情况是线程在等待网络的读写,比如当网络数据没有准备好读时,线程处于这种等待状态,而一旦有数据准备好读之后,线程会重新激活,读取并处理数据。在 Java引入 NewIO之前,对于每个网络连接,都有一个对应的线程来处理网络的读写操作,即使没有可读写的数据,线程仍然阻塞在读写操作上,这样有可能造成资源浪费,而且给操作系统的线程调度也带来压力。在 NewIO里采用了新的机制,编写的服务器程序的性能和可扩展性都得到提高。
    如果发现有大量的线程都在处在 Wait on condition,从线程 stack看, 正等待网络读写,这可能是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。一种情况是网络非常忙,几 乎消耗了所有的带宽,仍然有大量数据等待网络读 写;另一种情况也可能是网络空闲,但由于路由等问题,导致包无法正常的到达。所以要结合系统的一些性能观察工具来综合分析,比如 netstat统计单位时间的发送包的数目,如果很明显超过了所在网络带宽的限制 ; 观察 cpu的利用率,如果系统态的 CPU时间,相对于用户态的 CPU时间比例较高;如果程序运行在 Solaris 10平台上,可以用 dtrace工具看系统调用的情况,如果观察到 read/write的系统调用的次数或者运行时间遥遥领先;这些都指向由于网络带宽所限导致的网络瓶颈。另外一种出现 Wait on condition的常见情况是该线程在 sleep,等待 sleep的时间到了时候,将被唤醒[/quote]
    参见:[url]http://jameswxx.iteye.com/blog/1041173[/url]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程