闲话少说,直接上干货!直接上干货!直接上干货!运行环境为JAVA8。
一、jps(JVM Process Status Tool)
虚拟机进程状态工具
1.1 功能介绍
列出正在运行的虚拟机进程,并显示虚拟机执行的主类(main函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID),相当于Linux下的ps,不过它只列举Java进程。
1.2 命令格式
jps [-q] [-mlvV] [<hostid>]
<hostid>:<hostname>[:<port>]
1.3 使用举例
1.3.1 列出Java程序进程ID和Main函数名称
jps,等同于jps –V

1.3.2 只输出进程ID
jps –q

1.3.3 输出传递给Java进程(主函数)的参数
jps –m
1.3.4 输出主函数的完整路径
jps –l

1.3.5 显示传递给Java虚拟的参数
jps –v

1.3.6 列出远程机器JVM实例
默认连接端口为1099,需要远程机器开启RMI服务


二、jstat(JVM Statistics Monitoring Tool)
虚拟机统计信息监视工具
2.1 功能介绍
用于监视虚拟机各种运行状态信息的命令行工具。它可以用来显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集JIT编译等运行时数据。需要先用jps命令查询出java进程的vmid。
2.2 命令格式
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
option由以下值构成:
-class:监视类装载、卸载数量、总空间以及类装载所耗费的时间
-compiler: 输出JIT编译器编译过的方法、耗时等信息
-gc:监视Java堆状况,包括Eden区、两个survivor区、老年代、永久带等的容量、已用空间、GC时间合计等信息
-gccapacity:监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil:监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause:与-gcutil功能一样,但会额外输出导致上一次GC产生的原因
-gcnew:监视新生代GC状况
-gcnewcapacity:监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-gcold:监视老年代GC状况
-gcoldcapacity:监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcmetacapacity:输出永久代使用到的最大、最小空间
-printcompilation:输出已经被JIT编译方法
-t:在输出信息前加上一个Timestamp列,显示程序的运行时间
-h:可以在周期性数据输出后,输出多少行数据后,跟着一个表头信息
interval:用于指定输出统计数据的周期,单位为毫秒
count:用于指定一个输出多少次数据
2.3 使用举例
2.3.1 输出ClassLoader信息
jstat -class -t 5993 1000 2

2.3.2 查看JIT编译信息
jstat -compiler -t 5993

结果含义:Compiled:编译任务执行次数;
Failed:编译失败次数;
Invalid:编译不可用次数
Time:编译总耗时
FailedType:最后一次编译失败类型
FailedMethod:最后一次编译失败的类名和方法名
2.3.3 GC相关堆信息
jstat -gc 5993

结果含义:S0C,S1C:S0(to区)和S1(from区)大小KB
S0U,S1U:S0(to区)和S1(from区)已使用大小KB
EC,OC,MC,CCSC:eden,old,metaspace,compressed class space大小KB
EU,OU,MC,CCSU:eden,old,metaspace,compressed class space已使用大小KB
YGC,FGC:新生代GC,FullGC次数
YGCT,FGCT:新生代GC,FullGC耗时
GCT:GC总耗时
2.3.4 查看各个代大小
jstat -gccapacity 5993

NGCMN:年轻代(young)中初始化(最小)的大小(字节)
NGCMX:年轻代(young)的最大容量(字节)
NGC:年轻代(young)中当前的容量(字节)
S0C:年轻代中第一个survivor(幸存区)的容量(字节)
S1C:年轻代中第二个survivor(幸存区)的容量(字节)
EC:年轻代中Eden(伊甸园)的容量(字节)
OGCMN:old代中初始化(最小)的大小(字节)
OGCMX:old代的最大容量(字节)
OGC:old代当前新生成的容量(字节)
OC:old代的容量(字节)
MCMN:metaspace中初始化(最小)的大小(字节)
MCMX:metaspace的最大容量(字节)
MC:metaspace的容量(字节)
MCMN:compressed class space中初始化(最小)的大小(字节)
MCMX:compressed class space的最大容量(字节)
CCSC:compressed class space的容量(字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代full gc次数
2.3.5 查看相关百分比
jstat -gcutil 5993

S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
M:metaspace已使用的占当前容量百分比
CCS:compressed class space已使用的占当前容量百分比
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(full gc)gc次数
FGCT:从应用程序启动到采样时old代(full gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
2.3.6 显示GC原因
jstat -gccause 5993

结果含义:
LGCC:上次GC原因
GCC:此次GC原因
其他各项含义与-gcutil相同
2.3.7 查看新生代详细参数
jstat -gcnew 5993

结果含义:S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
2.3.8 年轻代对象的信息及其占用量
jstat -gcnewcapacity 5993

结果含义:NGCMN:年轻代(young)中初始化(最小)的大小(字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1CMX:年轻代中第二个survivor(幸存区)的最大容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(full gc)gc次数
2.3.9 old代对象的信息
jstat -gcold 5993

结果含义:MC:metaspace的容量 (字节)
MU:metaspace目前已使用空间 (字节)
CCSC:compressed class space的容量 (字节)
CCSU:compressed class space目前已使用空间 (字节)
OC:old代的容量 (字节)
OU:old代目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(full gc)gc次数
FGCT:从应用程序启动到采样时old代(full gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
2.3.10 old代对象的信息及其占用量
jstat -gcoldcapacity 5993

结果含义:OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量(字节)
OGC:old代当前新生成的容量 (字节)
OC:Old代的容量 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
FGC:从应用程序启动到采样时old代(full gc)gc次数
FGCT:从应用程序启动到采样时old代(full gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
2.3.11 metaspace对象的信息及其占用量
jstat -gcmetacapacity 5993

结果含义:MCMN:最小metaspace容量
MCMX:最大metaspace容量
MC:当前metaspace空间大小
CCSMN:最小compressed class space空间大小
CCSMX:最大compressed class space空间大小
CCSC:当前compressed class space空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
2.3.12 JVM编译方法统计
jstat -printcompilation 5993

结果含义:Compiled:最近编译方法的数量
Size:最近编译方法的字节码数量
Type:最近编译方法的编译类型
Method:方法名标识
三、jinfo(Configuration Info for Java)
Java配置信息工具
3.1 功能介绍
实时查看和调整虚拟机各项参数。需要先用jps查询出java进程的pid。
3.2 命令格式
jinfo [option] <pid>
jinfo [option] <executable <core>
jinfo [option] [server_id@]<remote server IP or hostname>
参数说明:pid:对应jvm的进程id
executable core:产生core dump文件
remote server IP or hostname:远程的ip或者hostname
server-id:标记服务的唯一性id
option取值:no option:输出全部的参数和系统属性
-flag name:输出对应名称的参数
-flag [+|-]name:开启或者关闭对应名称的参数
-flag name=value:设定对应名称的参数
-flags:输出全部的参数
-sysprops:输出系统属性
3.3 使用举例
3.3.1 输出虚拟机参数
jinfo -flags 5993

3.3.2 输出系统属性
jinfo -sysprops 5993

3.3.3 输出对应名称的参数
jinfo -flag PrintGCDetails 5993

3.3.4 开启或者关闭对应名称的参数
jinfo -flag +PrintGCDetails 5993

四、jmap(Memory Map for Java)
Java内存映像工具
4.1 功能介绍
功能介绍:用于生成堆转储快照(称为heapdump或dump文件),当然也可以在启动时通过设置-XX:+HeapDumpOnOutOfMemoryError参数让虚拟机在OOM异常出现之后自动生成dump文件。jmap的作用还包括查询finalize执行队列、java堆和类加载的详细信息,如空间使用率、当前使用的是哪种垃圾收集器等。需要先用jps查询出java进程的pid。
4.2 命令格式
jmap [option] <pid>
jmap [option] <executable <core>
jmap [option] [server_id@]<remote server IP or hostname>
参数说明:pid:对应jvm的进程id
executable core:产生core dump文件
remote server IP or hostname:远程的ip或者hostname
server-id:标记服务的唯一性id
option取值:-dump:生成Java堆转储快照。格式为:jmap -dump:[live,]format=b,file=<filename> pid,live表示只dump出存活的对象。
-finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效。
-heap:显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。只在Linux/Solaris平台下有效。
-histo:显示堆中对象统计信息,包括类、实例数量、合计容量。
-clstats:显示类加载器统计信息。
-F:当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照。只在Linux/Solaris平台下有效。
4.3 使用举例
4.3.1 生成堆转储快照

4.3.2 显示类加载器统计信息

4.3.3 观察系统finalizer队列中的对象
不恰当的finalize()方法可能导致对象堆积在finalizer队列中,使用-finalizerinfo参数可以查看堆积在finalizer队列中的对象。

4.3.4 显示堆中对象统计信息,类名、实例数量、所占容量

4.3.5 显示Java堆详细信息

五、jstack(Stack Trace for Java)
Java堆栈跟踪工具
5.1 功能介绍
堆栈跟踪工具用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。线程快照就是当前虚拟机内每条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间等待都是导致线程长时间停顿的常见原因。下面这些状态是我们使用jstack命令查看线程堆栈信息时可能会看到的线程的几种状态:
- 1)NEW:未启动的。不会出现在Dump中;
- 2)RUNNABLE:在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁;
- 3)BLOCKED:受阻塞并等待监视器锁。被某个锁(synchronizer)給block住了;
- 4)WATING:无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(),wait(),sleep(),join() 等语句里;
- 5)TIMED_WATING:有时限的等待另一个线程的特定操作。和WAITING的区别是wait()等语句加上了时间限制 wait(timeout);
- 6)TERMINATED:已退出的。
5.2 命令格式
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
jstack [-m] [-l] <executable> <core>
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
参数说明:pid:对应jvm的进程id
executable core:产生core dump文件
remote server IP or hostname:远程的ip或者hostname
server-id:标记服务的唯一性id
-m:如果调用到本地方法的话,可以显示C/C++的堆栈
-l:除堆栈外,显示关于锁的附加信息
5.3 使用举例
查看死锁线程
