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版本支持的選項。java

top

這裏主要查進程相關線程的資源使用狀況。centos

jstack

Java Virtual Machine Stack Trace for Java 顯示虛擬機的線程快照
jstack命令用於生成虛擬機當前時刻的線程快照(通常稱爲threaddump或javacore文件)。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如請求外部資源致使的長時間等待、線程間死鎖、死循環等都是致使線程長時間停頓的常見緣由。線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作些什麼事情,或者等待着什麼資源。ide

一、使用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

二、使用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

三、使用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

四、使用printf處理線程的16進制形式命令行

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

五、使用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]

六、查找函數功能
"VM Periodic Task Thread"
該線程是JVM週期性任務調度的線程,它由WatcherThread建立,是一個單例對象。該線程在JVM內使用得比較頻繁,好比:按期的內存監控、JVM運行情況監控。3d

"CompilerThread"
用來調用JITing,實時編譯裝卸CLASS。一般JVM會啓動多個線程來處理這部分工做,線程名稱後面的數字也會累加,好比CompilerThread1。code

相關文章
相關標籤/搜索