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