JAVA程序分析工具jstat和jstack
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。
JAVA程序分析工具jstat和jstack