JVM性能监控工具及其参数和查询结果解析
- jps:虚拟机进程状况工具
- jstat :虚拟机统计信息监控工具
- jstat帮助文档
- 命令参数解释
- 命令演示
- -class:监视类装载、卸载数量、总空间以及类装载所耗费的时间
- -gc:监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
- -gccapacity:监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大、最小空间
- -gcutil:监视内容与-gc基本相同,但是主要关注的已使用空间占总空间的百分比
- -gccause:与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
- -gcnew:监视新生代GC
- -gcnewcapacity:监视内容与-gcnew基本相同,主要关注的是使用到的最大、最小空间
- -gcold:监视老年代GC状况
- -gcoldcapacity:监视内容与-gcold基本相同,主要关注使用到的最大、最小空间
- -gcmetacapacity:监视metadata用到的最大、最小空间
- -compiler:输出JIT编译器编译过的方法、耗时等信息
- -printcompilation:输出JIT编译器编译过的文件大小、类型、方法等信息
- jinfo:Java配置信息工具
- jmap:Java内存映像工具
- 命令演示
- jmap -dump:[live,]format=b,file=fileName pid : 生成Java堆转储快照,live参数说明是否只dump存活的对象,format=b表示二进制格式
- jmap -histo[:live] pid:打印Java对象堆的直方图,即打印堆中对象信息统计信息,包括类、实例数量、合计容量。live参数表示是否只打印存活的对象信息
- jmap -finalizerinfo pid :显示在F-Queue中等待Finalizer线程执行finalize方法的对象
- jmap -heap pid : 打印Java堆详细信息,如使用哪种回收期、参数配置、分代状况等
- jmap -clstas pid : 打印类装载统计信息
- jmap -F [-dump:format=b,file=filename]|[-histo] pid : 当pid无没有响应时,与-dump或-histo连用,强制堆转储或打印堆对象统计信息,dump中live不能使用
- jhat:虚拟机堆转储快照分析工具
- jstack:Java堆栈跟踪工具
- HSDIS:JIT生成代码反汇编
jps:虚拟机进程状况工具
JVM Process Status Tool:显示指定系统内所有的HotSpot虚拟机进程
jps命令格式:jps [options] [hostid]
jps会列出进程的本地虚拟机唯一ID(Local Virtual Machine Indentifer, LVMID),跟UNIX系统的PID是一致的。
jps也可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
jps参数表
命令演示
jps -q :只输入LVMID,省略主类的名称
jps -l:输出主类的全名,如果进程执行的jar包,输出jar的路径
jps -m:输出虚拟机进程启动时传递给主类main()函数的参数
jps -v:输出虚拟机进程启动时的JVM参数(标记的地方为IDA中运行main方法时设置的JVM参数)
jstat :虚拟机统计信息监控工具
JVM StatisticsMonitoring Tool:用于监视虚拟机各种运行状态信息的命令行统计。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,是运行期定位虚拟机性能问题的首选命令行工具。
jstat帮助文档
命令参数解释
option :由jstat -options命令查询出的多个命令中的一个命令。
vmid:如果是本地虚拟机,那么对应的就是LVMID,如果是远程虚拟机进程,那VMID的格式应当是:
[protocol:][//]lvmid[@hostname[:port]/servername]
interval:统计间隔时间,格式:ms|s,即2ms|2s
count:需要统计的次数,可以跟interval结合使用,如果省略了interval和count,则表示只统计一次。
-J:将直接传递给运行时系统。
命令演示
-class:监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc:监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
结果解释:(内存单位:KB,都是从应用启动到采样截止的信息)
S0C: 第一个Survivor区总内存
S1C:第二个Survivor区的总内存
S0U:第一个Survivor已使用内存
S1U:第二个Survivor已使用内存
EC : Eden区总内存
EU : Eden区已使用内存
OC: Old区总内存
OU :Old区已使用内存
MC : Metadata区提交内存
MU : Metadata区已使用内存
CCSC:当前压缩类空间的容量
CCSU:当前压缩类空间目前已使用空间
YGC :年轻代GC次数
YGCT:年轻代GC总时间
FGC:Full GC次数
FGCT : Full GC时间
GCT:GC时间
-gccapacity:监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大、最小空间
NGCMN:年轻代初始化最小容量
NGCMX:年轻代最大容量
NGC:年轻代当前容量
S0C:第一个Survivor区容量
S1C:第二个Survivor区容量
EC:Eden区容量
OGCMN:老年代初始化最小容量
OGCMX:老年代最大容量
OGC:老年代当前新生成的容量
OC:老年代的容量
MCMN:Metadata的初始化最小容量
MCMX:Metadata的最大容量
MC:Metadata的容量
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:从应用程序启动到采样,年轻代总共发生的GC次数
FGC:从应用程序启动到采样,发生Full GC的次数
-gcutil:监视内容与-gc基本相同,但是主要关注的已使用空间占总空间的百分比
S0:第一个Survivor已使用空间占第一个Survivor总空间的百分比
S1:第二个Survivor已使用空间占第二个Survivor总空间的百分比
E:Eden区域已使用空间占Eden区域总空间的百分比
O:Old区域已使用空间占Old区域总空间的百分比
M:Metadata区域已使用空间占Metadata总空间的百分比
CCS:已使用压缩类空间占压缩类总空间的百分比
YGC:从应用程序启动到采样,年轻代发生GC的次数
YGCT:从应用程序启动到采样,年轻代发生GC的时间
FGC:从应用程序启动到采样,发生Full GC的次数
FGCT:从应用程序启动到采样,发生Full GC的时间
GCT:从应用程序启动到采样,总共发生GC的时间=YGCT+FGCT
-gccause:与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
LGCC:最后一次GC的原因
GCC:当前GC的原因(No GC,表示当前没有GC发生)
-gcnew:监视新生代GC
TT:持有次数
MTT:最大持有次数
DSS:期望的幸存区大小
其他的内容参考上面的解释。
-gcnewcapacity:监视内容与-gcnew基本相同,主要关注的是使用到的最大、最小空间
输出结果解释参考:-gccapacity命令。
-gcold:监视老年代GC状况
输出结果解释参考:-gc命令。
-gcoldcapacity:监视内容与-gcold基本相同,主要关注使用到的最大、最小空间
输出结果解释参考:-gccapacity命令。
-gcmetacapacity:监视metadata用到的最大、最小空间
输出结果解释参考:-gccapacity命令
-compiler:输出JIT编译器编译过的方法、耗时等信息
-printcompilation:输出JIT编译器编译过的文件大小、类型、方法等信息
Compiled:编译任务的数目
Size:方法生成的字节码的大小
Type:编译类型
Method:类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的
jinfo:Java配置信息工具
Configuration Info for Java:实时查看看和调整虚拟机各项参数。
命令演示
jinfo -flag name pid 命令:(name都是-XX后的参数)打印虚拟机中指定标志及其参数信息
jinfo -flag [+|-]name pid 命令:应用或取消在虚拟机中的标记
jinfo -flag name=value pid 命令:设置虚拟机中指定标记的参数
info -flags pid 命令:只打印虚拟机中的标记信息
jinfo -sysprops pid 命令:打印Java中的系统属性
jinfo pid 命令:打印以上所有信息
jmap:Java内存映像工具
Memory Map for Java :命令用于生成对转储快照(一般称为heapdump或dump文件)。也可以使用-XX:+HeapDumpOnOutOfMemoryError参数,让虚拟机在OOM异常出现后自动dump文件,也可以通过-XX:+HeapDumpOnCtrlBreak参数可以使用Ctrl+Break键让虚拟机生成dump文件。(注:生成dump文件会导致虚拟机进程停顿,内存越大停顿时间越长)
命令演示
jmap -dump:[live,]format=b,file=fileName pid : 生成Java堆转储快照,live参数说明是否只dump存活的对象,format=b表示二进制格式
jmap -histo[:live] pid:打印Java对象堆的直方图,即打印堆中对象信息统计信息,包括类、实例数量、合计容量。live参数表示是否只打印存活的对象信息
jmap -finalizerinfo pid :显示在F-Queue中等待Finalizer线程执行finalize方法的对象
jmap -heap pid : 打印Java堆详细信息,如使用哪种回收期、参数配置、分代状况等
接续上图
jmap -clstas pid : 打印类装载统计信息
jmap -F [-dump:format=b,file=filename]|[-histo] pid : 当pid无没有响应时,与-dump或-histo连用,强制堆转储或打印堆对象统计信息,dump中live不能使用
接续上图
jhat:虚拟机堆转储快照分析工具
JVM Heap Analysis Tool : 该命令与jmap搭配使用,分析jmap生成的堆转储快照。一般不建议直接使用jhat命令来分析dump文件,主要原因:
第一:分析dump文件不仅耗时而且消耗硬件资源,即使要做也会复制到其他机器上,因为家在dump快照文件需要比dump更大的内存,所以一般在64位JDK、大内存服务器上运行;
第二:jhat分析功能相对比较简陋。
命令演示
jhat file:分析dump文件
访问上图分析结果:
jstack:Java堆栈跟踪工具
Stack Track for Java : 用于生成虚拟机当前时刻的线程快照(一般为threaddump或者javacore文件)。
命令演示
jstack pid : 打印虚拟机当前时刻线程快照
jstack -l pid : 除堆栈外,显示关于锁的附加信息
接续上图
接续上图
jstack -m pid : 如果调用到本地方法的话,可以显示C/C++的堆栈
接续上图