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。