Thread.State

一般查看Java程序堆栈信息时,会使用jstack工具来获得java stack和native stack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
如果是在64位机器上,需要指定选项 -J-d64,Windows的jstack使用方式只支持jstack [-l] pid。
命令格式:

1
2
jstack [ option ] pid
jstack [ option ] executable core

常用参数说明:

1
2
3
4
-F   当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的所有栈信息.
-h | -help 打印帮助信息

jstack Dump日志文件中的线程状态中值得关注的线程状态有:
死锁,Deadlock,死锁线程,一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。
执行中,Runnable,一般指该线程正在执行状态中,该线程占用了资源,比如正在处理某个请求、进行数据类型等转换。
等待资源,Waiting on condition,等待资源,或等待某个条件的发生。具体原因需结合 stacktrace来分析。

  • 如果堆栈信息明确是应用代码,则证明该线程正在等待资源。一般是大量读取某资源,且该资源采用了资源锁的情况下,线程进入等待状态,等待资源的读取。
  • 又或者,正在等待其他线程的执行等。
  • 如果发现有大量的线程都在处在 Wait on condition,从线程 stack看,正等待网络读写,这可能是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。
  • 一种情况是网络非常忙,几乎消耗了所有的带宽,仍然有大量数据等待网络读写;
  • 另一种情况也可能是网络空闲,但由于路由等问题,导致包无法正常的到达。
  • 另外一种出现 Wait on condition的常见情况是该线程在 sleep,等待 sleep的时间到了时候,将被唤醒。

​ 等待获取监视器,Waiting on monitor entry
​ 暂停,Suspended
​ 对象等待中,Object.wait()TIMED_WAITING
​ 阻塞,Blocked,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程。
​ 停止,Parked

关于Waiting for monitor entry 和 in Object.wait():Monitor是Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者Class的锁。每一个对象都有也仅有一个monitor。从下图中可以看出,每个Monitor在某个时刻,只能被一个线程拥有,该线程就是“Active Thread”,而其它线程都是“Waiting Thread”,分别在两个队列“ Entry Set”和“Wait Set”里面等候。在“Entry Set”中等待的线程状态是“Waiting for monitor entry”,而在“Wait Set”中等待的线程状态是 “in Object.wait()”。
img点击并拖拽以移动编辑

解释一下waiting for monitor entry、waiting on condition 、in Object.wait():

“waiting for monitor entry”意味着线程在等待进入一个临界区 ,所以它在”Entry Set“队列中等待。此时线程状态一般都是Blocked:
java.lang.Thread.State: BLOCKED (on object monitor)

“waiting on condition”说明线程在等待另一个条件的发生来把自己唤醒,或者干脆它是调用了sleep(N)。此时线程状态大致为以下几种:
java.lang.Thread.State: WAITING (parking):一直等那个条件发生;
java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。

“in Object.wait()”说明线程获得了监视器之后,又调用了 java.lang.Object.wait() 方法。当线程获得了Monitor,如果发现线程继续运行的条件没有满足,它则调用对象(一般就是被synchronized的对象)的wait()方法,放弃了Monitor,进入“Wait Set”队列。
此时线程状态大致为以下几种:
java.lang.Thread.State: TIMED_WAITING (on object monitor);
java.lang.Thread.State: WAITING (on object monitor);
一般都是RMI相关线程(RMI RenewClean、 GC Daemon、RMI Reaper),GC线程(Finalizer),引用对象垃圾回收线程(Reference Handler)等系统线程处于这种状态。
建议在Java程序中应该尽量减少线程处于“waiting for monitor entry”状态,其次是“in Object.wait()”状态。


转载自:
http://blog.csdn.net/codetomylaw/article/details/40263261
http://blog.csdn.net/fenglibing/article/details/6411940