使用Java自带命令jstack生成线程快照

jstack命令

jstack命令在JDK的/bin目录下就能找到。

  • 作用:生成JVM当前时刻线程的快照(threaddump,即当前线程中的所有信息)
  • 目的:帮助定位程序问题出现的原因,如CPU占用率过高、长时间停顿、死锁、阻塞的问题。

命令参数:

  • -l (可省略) 加了之后会额外的输出锁的信息。
  • pid (progress id) 即线程id,将对应进程中所有线程的信息都dump出来

如何查看pid?
打开任务管理器:
这里写图片描述

WIN10系统默认显示了,低版本可能不显示。

打开任务管理器,选择进程,通过菜单列的-查看-来设置,打对勾就OK。如:
这里写图片描述

小案列

比如,运行一个Java程序,在进程中找到javaw.exe(pid并不是固定的)
这里写图片描述
在DOS下运行jstack命令(确保环境配置好,javac命令也能运行):
这里写图片描述
几点说明:

  • 第一行是当前线程快照生成的时间

  • 第二行中的 Java HotSpot(TM) 64-Bit Server VM是指Ecplise运行时使用的JRE和版本,
    HotSpot指虚拟机(sun公司的Java虚拟机);Server VM是虚拟机版本,服务器端的,还有一个是客户端的(Client)

  • “Thread-0”指线程名字,有daemon标识,指该线程为守护线程

  • prio=5,指的是线程的优先级;

  • tid,cid,后面的值为16进制的,也是标识线程的参数,根据这两个可找到CPU占用率较高的线程

  • Thread.state–指线程的状态,根据其可以找到线程出现问题的原因。如图中的TIMED_WAITING(sleeping),是指该线程调用了sleep()。

  • Locked ownable synchronizers: -None;指当前的线程是否处于同步块内,None表示不在同步块内,因为没有加synchronized关键字 。这段信息是关于锁的信息,如果不加-l参数就不会显示。

补充

在/bin下有很多命令:

  • jmap.exe ——生成堆快照
  • jstat.exe ——监测JVM运行状态,如类加载情况,类持有情况、内存使用情况等。
  • jconsole.exe ——同jstat.ex,只不过是界面化显示出来,方便直接。

上面都是命令行工具,现在有个更方便的界面化工具:JVisualVM java虚拟机分析工具 ,可自行下载学习