深入理解JVM:性能分析与监控工具

当线上出现问题的时候,最最最重要的是定位问题。一旦定位到问题了,一切都好办了。但是这个定位问题,需要的不仅仅是理论知识,还需要丰富的实操经验。而丰富的经验从哪里来呢,就是对于工具的运用和数据的分析中来,接下来主要介绍一下虚拟机中的性能监控以及故障处理工具。

1.概述

通常来说,定位问题最重要的是工具,对于工具的重要性是再怎么强调都不为过的。然而拥有丰富经验的大佬,也都是能熟练使用各种工具,就像一位能熟练运用十八般兵器的勇士一样,面对问题能手到擒来,迅速定位并解决。那么定位系统问题,离不开相关数据的支持。这些数据包括:运行日志,异常堆栈,GC日志,线程快照(threaddump/javacore文件),堆转储快照(heapdump/hprof文件)等。所以数据+工具是解决问题的制胜法宝,但要明确的一点是,没有包治百病的良药,也没有一定万能的工具。

2.JDK命令行工具

先来看看jdk目录下的工具(基于jdk1.8.0_201):

再来看看tools里面具体状况:
深入理解JVM:性能分析与监控工具_第1张图片
接下来介绍几个比较常用的处理工具

名称 主要作用
jps JVM Process Status Tool 显示指定系统内所有的HotSpot虚拟机进程
jstat JVM Statistics Monitoring Tool 用于收集HotSpot各方面运行数据
jinfo Configuration Info for Java 显示虚拟机配置信息
jmap Memory Map for Java 生成虚拟机的内存转储快照
jhat JVM Heap Dump Browser 用于分析heapdump文件,它会建立一个http服务器,让用户在网页上查看分析结果
jstack Stack Trace for Java 显示虚拟机的线程快照

2.1jps:虚拟机进程状况工具

主要用于列出当前虚拟机运行的进程等信息。与ps -aux | grep java 类似。

#命令格式
jps [options] [hostid]
#几种常用的例子
jps 直接输出当前运行中的虚拟机进程
jsp -l 可输出主类的全名,如果进行执行的是Jar包,输出Jar路径
jps -v 输出虚拟机进程启动时的JVM参数(重要,重要,重要)

上面的命令都比较简单,虽然比较简单,确是使用频率非常高的一个命令,比如需要输出虚拟机的运行参数,就可以通过jps -v输出,操作起来对线上虚拟机也没有什么影响,可放心使用。

2.2jstat:虚拟机统计信息监视工具

命令介绍

主要用户监控虚拟机各种运行状态信息,包括类装载,内存,垃圾收集,JIT编译等运行数据。

#jstat命令格式
jstat [option vmid [interval[s|ms] [count] ]
#举个例子
jstat -gc 2756 250 20 
每250毫秒查询一次垃圾回收情况,一共查询20次。2756是进程号。

选项的option代表着用户希望查询的虚拟机信息,主要分为:类装载,垃圾收集,运行期编译状况。

选项 作用
-class 监视类装载,卸载数量,总空间以及类装载所耗费的时间
-gc 监视Java堆状况,包括Eden区,两个survivor区,老年代,元空间等容量,已用空间,GC时间等合计信息
-gccapacity 与-gc基本相同,主要关注Java堆各区域使用到的最大,最小空间
-gcutil 与-gc基本相同,主要关注已使用空间占比情况
-gccause 与-gc基本相同,额外输出导致上一次gc的原因
-gcnew 监视新生代GC状况
-gcnewcapacity 与-gcnew基本相同,输出主要关注使用到的最大,最小空间
-gcold 监视老年代GC状况
-gcoldcapacity 与-gcold基本相同,输出主要关注使用到的最大,最小空间
-gcmetacapacity 监视元空间GC状况
-compiler 输出JIT编译过的方法,耗时等信息
-printcompilation 输出已经被JIT编译的方法

命令使用

  1. 查看类加载统计情况
jstat -class [pid]

深入理解JVM:性能分析与监控工具_第2张图片

loaded:加载的class数量
Bytes:所占用空间大小
Unloaded:未加载class数量
Bytes:未加载class占用空间
Time:时间

  1. 查看编译统计情况
jstat -compiler [pid]

编译统计情况

Compiled:编译数量
Failed:失败数量
Invalid:不可用数量
Time:时间
FailedType:失败类型
FailedMethod:失败方法

  1. 垃圾回收统计情况
jstat -gc [pid]

垃圾回收统计情况

S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0CU:第一个幸存区的使用大小
S1CU:第二个幸存区的使用大小
EC:伊甸园区的大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

  1. 堆内存统计
jstat -gccapacity [pid]

堆内存统计

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代gc次数

  1. 新生代垃圾回收统计
jstat -gcnew [pid]

新生代垃圾回收统计

S0C:第一个幸存区大小
S1C:第二个幸存区大小
S0U:第一个幸存区使用大小
S1U:第二个幸存区使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代中存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收的次数
YGCT:年轻代垃圾回收消耗时间

  1. 老年代垃圾回收统计
jstat -gcold [pid]

老年代垃圾回收统计

MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收耗时
GCT:垃圾回收总耗时

  1. 元数据空间统计
jstat -gcmetacapacity [pid]

元空间统计

MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

  1. 总结垃圾回收统计
jstat -gcuitl [pid]

总结垃圾回收统计

S0:幸存区1当前使用比例
S1:幸存区2当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

2.3jinfo:查看JVM配置信息工具

这个命令工具的作用是实时的查看和调整虚拟机的各项参数。
jinfo的格式:

jinfo [option] pid

2.4jmap:JVM内存映射工具

这个命令工具的主要作用是用于生成堆转储快照(一般称为heapdump或者dump文件),大部分情况下,出现内存或者CPU异常情况,都是通过手动的方式dump出内存快照。不过虚拟机参数一般会配置-XX:+HeapDumpOnOutOfMemoryError参数,当虚拟机出现OOM的情况下,会自动dump内存快照文件。
jmap的命令格式:

jmap [option] vmid

常用选项的含义如下:

选项 作用
-dump 生成dump文件,例如: jmap -dump:live,format=b,file=xxx.hprof [pid]
-heap 显示java堆详细信息,那种回收器,参数配置,分代状况等
-histo 显示堆中对象统计信息,包括类,实例数量,合计容量

2.5jstack:java堆栈跟踪工具

jstack工具的作用是生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件),生成线程快照的主要原因是排查线程出现长时间停顿,例如线程间死锁,死循环等。
jstack的命令格式:

jstack [option] vmid

使用jstack导出当前线程快照:

jstack 3321 > 3321.log

你可能感兴趣的:(JVM基础与原理,jvm)