1、概述
JDK为开发人员提供一些工具,可以查看异常堆栈、虚拟机运行日志、垃圾收集器日志、线程快照、堆转储快照等。当我们遇到一些问题时,通过这些工具定位问题,解决问题。下面介绍几个常用的工具。
2、基础工具
2.1、jps
jps(JVM Process Status Tool)列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main() 函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)。
命令格式:
1 | jps [options] [hostid] |
参数解释:
options:可以使用如下参数。
- -q:显示进程ID。
- -m:显示进程ID,主类名称,以及传入main方法的参数。
- -l:显示进程ID,主类全名。
- -v:显示进程ID,主类名称,以及传入JVM的参数。
- -V:显示进程ID,主类名称。
注意:其中 -mlv 可以连用。
hostid:主机或者服务器的ip,如果不指定,默认为当前的主机或者是服务器。
示例:列出所有的虚拟机进程。
1 | jps -l |
2.2、jstat
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。
命令格式:
1 | jstat [option vmid [interval[s|ms] [count]]] <pid> |
参数解释:
- option:指定要查询的虚拟机信息,主要分为3类:类加载、内存、垃圾收集和即时编译状况,具体选项及作用如下:
- -class:监视类加载、卸载数量、总空间以及类装载所耗费的时间。
- -compiler:输出即时编译器编译过的方法、耗时等信息。
- -gc:监视Java 堆状况,包括 Eden 区、2个 Survivor区、老年代、永久代等的容量,已用空间,垃圾收集时间合计等信息。
- -gccapacity:监视内容与 gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大、最小空间。
- -gccause:显示有关垃圾收集统计信息(同-gcutil),以及上一次和当前(如果适用)垃圾收集事件的原因。
- -gcnew:显示新生代行为的统计信息。
- -gcnewcapacity:显示有关新生代大小及其相应空间的统计信息。
- -gcold:显示有关老年代行为的统计信息。
- -gcoldcapacity:显示有关老年代大小及其相应空间的统计信息。
- -gcmetacapacity:显示有关元空间大小的统计信息。
- -gcutil:显示有关垃圾收集统计信息。
- -printcompilation:显示Java HotSpot VM编译方法统计信息。
vmid:如果是本地虚拟机进程,vmid和本地虚拟机唯一ID是一致的;如果是远程虚拟机进程,那么vmid的格式应当是:protocol:lvmid[@hostname[:port]/servername]
interval:采样间隔,单位为秒(s)或毫秒(ms),默认单位是毫秒。必须为正整数。指定后,该jstat命令将在每个间隔产生其输出。
count:要显示的样本数。
示例:
- 展示类加载器统计信息。
1 | jstat -class 6240 |
结果:
Loaded Bytes Unloaded Bytes Time
610 1232.9 0 0.0 0.08
- Loaded:已加载的类总数。
- Bytes:加载的KB数。
- Unloaded:卸载的类总数。
- Bytes:卸载的KB数。
- Time:执行类加载和卸载操作所花费的时间。
- 展示Java HotSpot VM 即时编译器统计信息。
1 | jstat -compiler 6240 |
结果:
Compiled Failed Invalid Time FailedType FailedMethod
74 0 0 0.02 0
- Compiled:执行的编译任务数。
- Failed:失败的编译任务数。
- Invalid:无效的编译任务数。
- Time:执行编译任务所花费的时间。
- FailedType:上次失败的编译的编译类型。
- FailedMethod:上次失败的编译的类名和方法。
- 展示垃圾收集的堆统计信息。
1 | jstat -gc 6240 |
结果:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1024.0 1024.0 0.0 0.0 8192.0 5049.1 10240.0 0.0 4480.0 776.8 384.0 76.6 0 0.000 0 0.000 0.000
- S0C:当前幸存者空间0容量(KB)。
- S1C:当前幸存者空间1容量(KB)。
- S0U:幸存者空间0使用大小(KB)。
- S1U:幸存者空间1使用大小(KB)。
- EC:当前伊甸园空间容量(KB)。
- EU:伊甸园空间使用大小(KB)。
- OC:当前老年代容量(KB)。
- OU:老年代使用大小(KB)。
- MC:元空间容量(KB)。
- MU:元空间使用大小(KB)。
- CCSC:压缩的类空间容量(KB)。
- CCSU:使用的压缩类空间(KB)。
- YGC:新生代垃圾收集事件的数量。
- YGCT:新生代垃圾收集时间。
- FGC:完整GC垃圾收集事件的数量。
- FGCT:完整GC垃圾收集时间。
- GCT:总垃圾收集时间。
2.3、jinfo
jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数。
命令格式:
1 | jinfo [option] <pid> |
参数解释:
- option
- no option:输出全部的参数和系统属性。
- -flag name:输出对应名称的参数。
- -flag[+|-]name:开启或者关闭对应名称的参数。
- -flag name=value:设定对应名称的参数。
- -flags:输出全部的参数。
- -sysprops:输出系统属性。
示例:输出当前进程的jvm全部参数。
1 | jinfo -flags 6240 |
2.4、jmap
jmap(Memory Map for Java)可以生成 java 程序的 dump 文件,也可以查看堆内对象信息、查看ClassLoader 的信息以及 finalizer 队列。
命令格式:
1 | jmap [option] <pid> |
参数解释:
- option
- no option:查看进程的内存映像信息,类似 Solaris pmap命令。
- -heap:显示Java堆详细信息。
- -histo[:live]:显示堆中对象的统计信息。
- -clstats:打印类加载器信息。
- -finalizerinfo:显示在F-Queue队列等待Finalize线程执行finalizer方法的对象。
- -dump:
:生成堆转储快照。
示例:生成堆转储快照。
1 | jmap -dump:live,format=b,file=E:\jmap.bin 34152 |
2.5、jstack
jstack(Stack Trace for Java)命令用于查看或导出虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、长时间等待外部资源等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么 事情,或者等待什么资源。如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息。
命令格式:
1 | jstack [option] <pid> |
参数解释:
- option
- -F:当线程挂起时,使用jstack -l pid 请求不被响应时,强制输出线程堆栈。
- -l:除堆栈外,显示关于锁的附加信息,例如ownable synchronizers
- -m:可以同时输出java以及C/C++的堆栈信息。
示例: 输出堆栈信息,并显示关于锁的附加信息。
1 | jstack -l 34692 |
3、可视化工具
3.1、JConsole
JConsole(Java Monitoring and Management Console)是一款基于JMX的可视化监视、管理工具。它的主要功能是通过JMX的MBean 对系统进行信息收集和参数动态调整。
连接:
可以连接本地进程,也支持远程进程。
主界面:
概览中展示了堆内存、线程、类、CPU的使用信息。上面还可以查看每个模块详细的信息。这里没什么难度,就不详细介绍了。
3.2、JVisualVM
VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。Oracle曾在VisualVM的软件说明中写上了“All-in-One”的字样,预示着它除了常规的运行监视、故障处理外,还将提供其他方面的能力,譬如性能分析(Profiling)。VisualVM的性能分析功能比起JProfiler、YourKit等专业且收费的Profiling工具都不遑多让。而且相比这些第三方工具,VisualVM还有一个很大的优点:不需要被监视的程序基于特殊Agent去运行,因此它的通用性很强,对应用程序实际性能的影响也较小,使得它可以直接应用在生产环境中。这个优点是JProfiler、YourKit等工具无法与之媲美的。