jdk 的bin目录下面附带了很多小工具来帮助我们对jvm进行监控和分析,下面主要分析几种常见的工具
名称 | 作用 |
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 Dunp Browser,用于分析heapdump文件,他会建立一个HTTP/HTML服务,让用户可通过浏览器查看 |
jstack | Stack Track for java ,显示虚拟机线程快照 |
一、JPS(Java Process Status Tool)
主要是可以找到想要监控的相关进程的Id和虚拟机进程启动时JVM参数,如果执行jps命令没有反应,可以执行source /etc/profile试一试
例子:
二、jstat :虚拟机统计信息监控工具
例子:
结果说明:
Loaded | 类装载数量 |
Bytes | 类装载总空间、类卸载总空间 |
Unloaded | 类卸载数量 |
Time | 类装载所耗费的时间 |
S0C | 新生代中Survivor space中S0当前容量的大小(KB) |
S1C | 新生代中Survivor space中S1当前容量的大小(KB) |
S0U | 新生代中Survivor space中S0容量使用的大小(KB) |
S1U | 新生代中Survivor space中S1容量使用的大小(KB) |
EC | Eden space当前容量的大小(KB) |
EU | Eden space容量使用的大小(KB) |
OC | Old space当前容量的大小(KB) |
OU | Old space使用容量的大小(KB) |
PC(MC) | Permanent space(Meta Space)当前容量的大小(KB),在JDK1.8 虚拟机移除了永久代,用元空间代替 |
PU(MC) | Permanent space(Meta Space)使用容量的大小(KB),在JDK1.8 虚拟机移除了永久代,用元空间代替 |
CCSC | 压缩类空间大小 |
CCSU | 压缩类空间使用大小 |
YGC | 从应用程序启动到采样时发生 Young GC 的次数 |
YGCT | 从应用程序启动到采样时 Young GC 所用的时间(秒) |
FGC | 从应用程序启动到采样时发生 Full GC 的次数 |
FGCT | 从应用程序启动到采样时 Full GC 所用的时间(秒) |
GCT | T从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC |
S0 | 新生代中Survivor space中S0当前使用比例 |
S1 | 新生代中Survivor space中S1当前使用比例 |
E | 伊甸园区使用比例 |
O | 老年代使用比例 |
M | 元数据区使用比例 |
CCS | 压缩使用比例 |
NGCMN | 新生代最小容量 |
NGCMX | 新生代最大容量 |
NGC | 当前新生代容量 |
OGCMN | 老年代最小容量 |
OGCMX | 老年代最大容量 |
OGC | 当前老年代大小 |
MCMN | 最小元数据容量 |
MCMX | 最大元数据容量 |
CCSMN | 最小压缩类空间大小 |
CCSMX | 最大压缩类空间大小 |
LGCC | 垃圾回收的原因 |
GCC | 垃圾回收的原因 |
TT | 对象在新生代存活的次数 |
MTT | 对象在新生代存活的最大次数 |
DSS | 期望的幸存区大小 |
S0CMX | 最大新生代中Survivor space中S0大小 |
S1CMX | 最大新生代中Survivor space中S1大小 |
三、jinfo:java配置信息工具
四、jmap:java内存映像工具,用于生成堆转储快照
例子和结果说明:
root@VM-16-2-ubuntu:/home/ubuntu# jmap -heap 1491 Attaching to process ID 1491, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.144-b01 using thread-local object allocation. Mark Sweep Compact GC Heap Configuration: #类的初始化配置 MinHeapFreeRatio = 40 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率 MaxHeapFreeRatio = 70 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率 MaxHeapSize = 228589568 (218.0MB) #-XX:MaxHeapSize=设置JVM堆的最大大小 NewSize = 4849664 (4.625MB) #-XX:NewSize=设置JVM堆的‘新生代’的默认大小 MaxNewSize = 76152832 (72.625MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小 OldSize = 9830400 (9.375MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小 NewRatio = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率 SurvivorRatio = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 MetaspaceSize = 21807104 (20.796875MB) #-XX:MetaspaceSize=<value>:设置JVM堆的元空间初始大小 CompressedClassSpaceSize = 1073741824 (1024.0MB) #压缩类空间大小 MaxMetaspaceSize = 17592186044415 MB #-XX:MaxMetaspaceSize=512m :设置JVM堆的元空间最大大小 G1HeapRegionSize = 0 (0.0MB) #G1收集器划分的Region的大小 Heap Usage: New Generation (Eden + 1 Survivor Space): capacity = 8060928 (7.6875MB) used = 1481128 (1.4125137329101562MB) free = 6579800 (6.274986267089844MB) 18.374162379319106% used Eden Space: capacity = 7208960 (6.875MB) used = 1406328 (1.3411788940429688MB) free = 5802632 (5.533821105957031MB) 19.508056640625% used From Space: capacity = 851968 (0.8125MB) used = 74800 (0.0713348388671875MB) free = 777168 (0.7411651611328125MB) 8.779672475961538% used To Space: capacity = 851968 (0.8125MB) used = 0 (0.0MB) free = 851968 (0.8125MB) 0.0% used tenured generation: capacity = 17690624 (16.87109375MB) used = 17520224 (16.708587646484375MB) free = 170400 (0.162506103515625MB) 99.03677789997684% used 13378 interned Strings occupying 1836560 bytes.
五、jhat : 虚拟机对转储快照分析工具,与jmap搭配使用,来分析jmap生成的堆转储快照。
这个比较少用到
六、jstack:java堆栈跟踪工具,用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机每条线程正在执行的方法堆栈集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因。
上面的都是命令行工具,下面两个是可视化工具
七、JConsole:java监视与管理控制台
可以监控本地进程和远程进程,本地进程比较简单可以直接选择监控的进程。远程linux上面的java虚拟机进程则需要进行相关的配置。
先修改tomcat的bin目录下面的catalina.sh文件,在Execute The Requested Command 这一行下面增加如下配置
# ----- Execute The Requested Command ----------------------------------------- JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote" #ip为服务器真实ip JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345" #远程端口 JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=true" #是否需要密码 JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.pwd.file=/opt/jdk1.8.0_144/jre/lib/management/jmxremote.password"
然后进入/opt/jdk1.8.0_144/jre/lib/management/下,复制一份jmxremote.password.template ,改名为jmxremote.password,将最后两行的注释放开,同时修改密码。
修改jmxremote.password的文件权限 chmod 600 jmxremote.password jmxremote.access
然后就可以远程连接了。
下图分别是本地和远程的监控图
八、jvisualvm:多合一故障处理工具
jvisualvm可视化工具和jconsole一样,也是需要进行上述配置才能远程。监控界面如下
如果jvisualvm 无法安装插件,则通过下面的链接来下载后安装
https://visualvm.github.io/pluginscenters.html