Java线程状态及监控工具

线程状态

在监控的过程中,要弄明白下边这6种状态(我们主要关注分析的:Runnable, Blocked, Waiting):

  1. NEW
      当线程对象对创建后,即进入了新建状态
  2. RUNNABLE
      当调用线程对象的start()方法,线程即进入就绪状态。正在 Java 虚拟机中执行的线程处于这种状态。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
  3. BLOCKED
      处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
    • 等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
    • 同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
    • 其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  4. WAITING
      无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。某一线程因为调用下列方法之一而处于等待状态:
    • 不带超时值的 Object.wait
    • 不带超时值的 Thread.join
    • LockSupport.park
  5. TIMED_WAITING
      具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态:
    • Thread.sleep
    • 带有超时值的 Object.wait
    • 带有超时值的 Thread.join
    • LockSupport.parkNanos
    • LockSupport.parkUntil
  6. TERMINATED
      已终止线程的线程状态。线程已经结束执行。

监控工具

线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程Dump是非常有用的诊断Java应用问题的工具,每一个Java虚拟机都有及时生成显示所有线程在某一点状态的线程Dump的能力。

JVisualVM

这是Java平台本身提供的性能分析工具。该工具是用来监控java运行程序的cpu、内存、线程等的使用情况。并且使用图表的方式监控java程序、还具有远程监控能力。
Java VisualVM
Notes:这里只做个简单说明,用到的地方再详细说明。

Jstack

jstack是java虚拟机自带的一种堆栈跟踪工具,用于生成java虚拟机当前时刻的线程快照。
使用jstack命令的帮助可以看到,该工具的功能也很强大:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
C:>jstack
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote serv
(to connect to a remote debug server)

Options:
-F to force a thread dump. Use when jsta
is hung)
-m to print both java and native frames
-l long listing. Prints additional infor
-h or -help to print this help message

JProfiler

是一个商业授权的Java剖析工具,它把CPU、执行绪和内存的剖析组合在一个强大的应用中。
这里不做过多介绍。

唐胡璐 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
分享创造价值,您的支持将鼓励我继续前行!