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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章