关于JStack中的wait on condition

问题描述

请教一下 JStack中的wait on condition是什么意思?我发现,某个线程在jstack中被标识为“wait on condition”时,下面的线程状态,有时候是:“RUNNABLE”,也有的时候是:“TIMED_WAITING”至于其他状态,应该也有,只是我只简单看到这两个而已。那个这个“wait on condition”在jstack中究竟是什么含义呢?JStack对应的信息在JConsole中一样可以查看。但是在JConsole中并没有给出“wait on condition”的概念。另外,jconsole的查看到的线程信息,来源是MBean中的java.lang.management.ThreadMXBean的线程描述信息:java.lang.management.ThreadInfo这一点确信无异。(这一点我猜测是JMX通过不同的连接器发布出来的) 问题补充:我在网上搜索找到一篇文章:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html但是我觉得这篇文章概念有些混乱。 尤其在说到线程状态的时候,请严格按照JVM规范来描述。按照约定,线程状态只有以下几种:NEW 至今尚未启动的线程的状态(jstack不讨论此类线程)RUNNABLE 可运行线程的线程状态。处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。BLOCKED 受阻塞并且正在等待监视器锁的某一线程的线程状态。(比如synchronized (lock) {}而lock被其他线程持有时,当前线程就会进入BLOCKED状态)WAITING 描述非常清楚,包括3种情况: 不带超时值的 Object.wait 不带超时值的 Thread.join LockSupport.park TIMED_WAITING 以下5种情况: Thread.sleep 带有超时值的 Object.wait 带有超时值的 Thread.join LockSupport.parkNanos LockSupport.parkUntil TERMINATED 线程已终止(jstack不讨论此情况)我所引用的文章对这些概念描述很混乱。 要讨论请使用严谨的专业术语。

解决方案

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

时间: 2024-11-01 02:39:57

关于JStack中的wait on condition的相关文章

浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化

原文:浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化   本文出处:http://www.cnblogs.com/wy123/p/7374078.html(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他)     ICP优化原理 Index Condition Pushdown (ICP),也称为索引条件下推

android使用ant自动打包(包括更改文件中的内容)

在ant打包过程中的一些学习所得以及用于这个项目的build文件的大体思路如下: 首先配置好整个系统所需的ant编译环境,在build.properties中配置好相关的参数.(build.properties文件主要包涵了一些在编译中需要用到工具的路径,以及一些需要配置的参数,如应用包名,项目名,以及一些需要传入的参数.写在build.properties中主要是为了方便配置文件的集中管理)在这次ant打包的需求中,需要修改一个java文件中的两个常量属性.根据这样的需求,首先需要拿到普通an

WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭

原文:WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭 在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟踪处理.本文介绍我在我在我的框架里面使用WCF服务的时候,出现的一个常见错误的处理方法,它的提示信息是:基础连接已经关闭: 连接被意外关闭.这种情况我碰到的有两种,一种是返回DataTable的时候出现的,一种是返回实体类

Python中条件选择和循环语句使用方法介绍_python

同C语言.Java一样,Python中也存在条件选择和循环语句,其风格和C语言.java的很类似,但是在写法和用法上还是有一些区别.今天就让我们一起来了解一下. 一.条件选择语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下: 复制代码 代码如下: if condition: block elif condition: block ... else block 其中elif和else语句块是可选的.对于if和elif只有condition为True时,

详解Java多线程编程中互斥锁ReentrantLock类的用法_java

0.关于互斥锁 所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronized机制更广泛的锁定操作, Lock和synchronized机制的主要区别: synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要出现在一个块结构中, 当获取了多个锁时, 它们必须以相反的顺序释放. synchronized机制对锁的释放是

jconsole线程面板中的阻塞总数和等待总数(转)

阻塞总数 Blocked count is the total number of times that the thread blocked to enter or reenter a monitor. I.e. the number of times a thread has been in the java.lang.Thread.State.BLOCKED state. 等待总数 Waited count is the total number of times that the thr

C#编码,书写规范

C#编码规范C#编程<>规范<>Version 2.0目录第一章 概述<>规范<>制定原则1 方便代码的交流和维护.2 不影响编码的效率,不与大众习惯冲突.3 使代码更美观,阅读更方便.4 使代码的逻辑更清晰,更易于理解.术语定义Pascal 大小写将标识符的首字母和后面连接的每个单词的首字母都大写.可以对三字符或更多字符的标识符使用Pascal 大小写.例如:BackColorCamel 大小写标识符的首字母小写,而每个后面连接的单词的首字母都大写.例如:

Axure常用交互效果制作

本文旨在分享一些在Axure中,相对复杂但又常见的交互行为的制作方法,本期包含带提示的文本框和拖拽效果. 1.带提示的文本框 将提示信息放置于文本框内是一种常见的交互方式.当文本框获得焦点时,提示文字消失.当文本框失去焦点时,提示文字重新显示出来.现在就让我们看下这种控件的制作方法. 第一步: 从widget库中拖出text field控件.双击控件在其中输入提示文字.然后在widget properties面板里,为该text field写入标签:"find people". 第二步

加速MySQL SQL语句优化的一些命令方法

引言 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又会耗费DBA很多精力.于是萌发了自己编写小工具,提高优化效率的想法. 那选择何种语言来开发工具呢? 对于一名DBA来说,掌握一门语言配合自己的工作是非常必要的.相对于shell的简单.perl的飘逸,Python是一种严谨的高级语言.其具备上手快.语法简单.扩展丰富.跨平台等多种优点.很多人把它称为