通过JVM监控,我们可以了解GC的内部过程,知道什么时候新生代的对象被移动到老年代,什么时候发生了GC,以及GC持续了多长时间。
想要进行JVM调优,必须要知道当前的JVM状态,JVM监控是必不可少的一步,这里主要介绍三种常见的JVM监控方式。
jstat
最原始却最有效的一种方式,不需要对java应用做额外的配置,安装JDK的时候默认就有的工具,当我们想要了解JVM运行状态的时候,一个jstat就能满足我们大部分的需求。
1 一般jstat与java程序安装在一起,我们可以看一下。
image-201910012155406892 使用
# 例如:jstat -class -t 79065 1000 5,代表监控pid为79065的jvm进程,查看其class信息,并且没1s钟监控一次,总共监控5次。
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
# jstat可以监控的内容如下
jstat -options
-class 统计JVM中classload的信息
-compiler 统计JIT编译器的信息
-gc 统计GC的堆内存信息
-gccapacity 统计JVM的堆内存剩余空间
-gccause 统计导致最新一次GC的原因
-gcmetacapacity
-gcnew 统计新生代的信息
-gcnewcapacity
-gcold 统计老年代的信息
-gcoldcapacity
-gcutil 显示GC的统计信息
-printcompilation 显示JVM的编译方法统计
2019-10-01 22.02.34
列解释:
S0C 存活区0的容量(KB)
S1C 存活区1的容量(KB)
S0U 存活区0使用的空间 (KB).
S1U 存活区1的利用空间 (KB).
EC Eden区的容量(KB).
EU Eden区利用的容量(KB).
OC 老年代容量(KB).
OU 老年代使用容量(KB).
PC 当前永久带的容量(KB).
PU 永久带使用容量(KB).
YGC 发生了多少次Young GC
YGCT Young GC的时间
FGC Full GC的次数
FGCT Full GC的收集时间
GCT 总共的GC时间.
看到上面是不是发现,简单直接有有效。
jconsole或jvisualvm
这两个工具也是JDK自带的内容,jvisualvm可能需要在线下载一下,不过两者都是通过jmx来访问JVM然后进行统计的,在启动JVM的时候,要指定jmx的内容。
方式一:指定密码,增加安全性
java -Dcom.sun.management.jmxremote.port=5000 -Dcom.sun.management.jmxremote.password.file=/Users/aihe/Documents/jmxremote.password -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.access.file=/Users/aihe/Documents/jmxremote.access -jar target/jmxdemo-0.0.1-SNAPSHOT.jar
image-20191001222219155
image-20191001222423253
image-20191001222342645
arthas
阿里开源的一款好用的jvm监控工具,有点像是把jdk中自带的命令行工具做了集合。
1 安装
# 安装方式一
curl -L https://alibaba.github.io/arthas/install.sh | sh
# 安装方式二
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
2 使用
java -jar arthas-boot.jar
image-20191001223248949
image-20191001223319224
参考地址:https://alibaba.github.io/arthas/install-detail.html
注意
使用完之后记得shutdown,如果不shutdown可能存在一些问题,比如监控的仍然是上次的jvm进程,反正就先用shutdown吧。
最后
本次介绍了自己常用的监控JVM工具,如果有更好的工具,请推荐给我
网友评论