Jstat是JDK自帶的一個輕量級小工具。全稱「Java Virtual Machine statistics monitoring tool」,它位於java的bin目錄下,主要利用JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收情況的監控。可見,Jstat是輕量級的、專門針對JVM的工具,很是適用。
jstat工具特別強大,有衆多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程id,和所選參數。
jstat -options 能夠列出當前JVM版本支持的選項。java
這裏主要查進程相關線程的資源使用狀況。centos
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