JAVA程序分析工具jstat和jstack

jstat

Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。
jstat -options 可以列出当前JVM版本支持的选项。

top

这里主要查进程相关线程的资源使用情况。

jstack

Java Virtual Machine Stack Trace for Java 显示虚拟机的线程快照
jstack命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如请求外部资源导致的长时间等待、线程间死锁、死循环等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。

1、使用jstat -gc显示gc的信息,查看gc的次数,及时间

[root@VM_101_10_centos output]# /usr/local/jdk/bin/jstat -gc 15834 250 20
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402203.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402518.7  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402518.7  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402826.0  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 402826.0  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 403040.3  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 404001.7  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843
52416.0 52416.0  0.0   17984.6 419456.0 404322.4  524288.0   76193.9   72088.0 70425.5 8856.0 8528.0     27    0.719   4      0.124    0.843

2、使用jstat -gcutil统计gc信息

[root@VM_101_10_centos output]# /usr/local/jdk/bin/jstat -gcutil 15834 
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
 32.05   0.00  20.83  14.53  97.79  96.30     28    0.730     4    0.124    0.854

3、使用top -Hp显示进程所有的线程信息查找CPU耗时最长线程PID

[root@VM_101_10_centos output]# top -Hp 15834
top - 11:21:25 up 31 days, 16:20,  3 users,  load average: 0.02, 0.02, 0.05
Threads:  96 total,   0 running,  96 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.1 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8010308 total,   399352 free,  4824492 used,  2786464 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2860188 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                 
15834 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java                                                                    
15837 root      20   0 4783692 900036  19164 S  0.0 11.2   0:10.91 java                                                                    
15838 root      20   0 4783692 900036  19164 S  0.0 11.2   0:02.02 java                                                                    
15839 root      20   0 4783692 900036  19164 S  0.0 11.2   0:02.02 java                                                                    
15840 root      20   0 4783692 900036  19164 S  0.0 11.2   0:01.99 java                                                                    
15841 root      20   0 4783692 900036  19164 S  0.0 11.2   0:02.09 java                                                                    
15842 root      20   0 4783692 900036  19164 S  0.0 11.2   0:03.29 java                                                                    
15843 root      20   0 4783692 900036  19164 S  0.0 11.2   0:12.46 java                                                                    
15844 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.03 java                                                                    
15845 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.07 java                                                                    
15846 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java                                                                    
15847 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java                                                                    
15848 root      20   0 4783692 900036  19164 S  0.0 11.2   0:57.35 java                                                                    
15849 root      20   0 4783692 900036  19164 S  0.0 11.2   0:53.66 java                                                                    
15850 root      20   0 4783692 900036  19164 S  0.0 11.2   0:08.55 java                                                                    
15851 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.22 java                                                                    
15852 root      20   0 4783692 900036  19164 S  0.0 11.2   1:05.21 java                                                                    
15864 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.14 java                                                                    
15885 root      20   0 4783692 900036  19164 S  0.0 11.2   0:26.94 java                                                                    
15886 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java                                                                    
15890 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.00 java                                                                    
15891 root      20   0 4783692 900036  19164 S  0.0 11.2   0:31.89 java                                                                    
15893 root      20   0 4783692 900036  19164 S  0.0 11.2   0:00.08 java              

4、使用printf处理线程的16进制形式

[root@VM_101_10_centos output]#  printf "%x\n" 15852 
3dec

5、使用jstack查找耗时进程是哪个函数

[root@VM_101_10_centos output]#  jstack 15834 |grep 3dec
"VM Periodic Task Thread" os_prio=0 tid=0x00007f0350135000 nid=0x3dec waiting on condition 
[root@VM_101_10_centos output]#  jstack 15834 |grep 3de8
"C2 CompilerThread0" #6 daemon prio=9 os_prio=0 tid=0x00007f0350105800 nid=0x3de8 waiting on condition [0x0000000000000000]
[root@VM_101_10_centos output]#  jstack 15834 |grep 3de9
"C2 CompilerThread1" #7 daemon prio=9 os_prio=0 tid=0x00007f0350108000 nid=0x3de9 waiting on condition [0x0000000000000000]

6、查找函数功能
“VM Periodic Task Thread”
该线程是JVM周期性任务调度的线程,它由WatcherThread创建,是一个单例对象。该线程在JVM内使用得比较频繁,比如:定期的内存监控、JVM运行状况监控。

“CompilerThread”
用来调用JITing,实时编译装卸CLASS。通常JVM会启动多个线程来处理这部分工作,线程名称后面的数字也会累加,比如CompilerThread1。