【JVM系列4】JVM常用命令

讲解JVM的常用命令,为后面讲解JVM日志分析做准备。
前言
JVM比较重要的知识,在前面三篇文章都将完了,GC日志在第一篇文章中也有所提及,这篇文章主要讲解JVM常用的命令,虽然jvm调优成熟的工具已经有很多,但是所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命令的使用也让我们更能了解jvm构成和特性。
Sun JDK监控和故障处理命令有jps、jstat、jmap、jhat、jstack、jinfo,下面做一一介绍。
jps
JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
命令格式:
jps [options] [hostid]
option参数:
- -l : 输出主类全名或jar路径
- -q : 只输出LVMID
- -m : 输出JVM启动时传递给main()的参数
- -v : 输出JVM启动时显示指定的JVM参数
示例:
82518 sun.tools.jps.Jps -l -m
69981 /Users/mengloulv/Library/Application Support/JetBrains/IntelliJIdea2020.1/plugins/idea-spring-tools/lib/server/language-server.jar
79213 org.apache.catalina.startup.Bootstrap start
79212 org.jetbrains.jps.cmdline.Launcher /Applications/IntelliJ IDEA.app/Contents/lib/asm-all-7.0.1.jar:xxx...
jstat
jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
详见:https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html#gcnew_option
jstat介绍
jstat命令命令格式:
jstat [Options] vmid [interval] [count]
命令参数说明:
Options,一般使用 -gcutil 或 -gc 查看gc 情况
pid,当前运行的 java进程号
interval,间隔时间,单位为秒或者毫秒
count,打印次数,如果缺省则打印无数次
Options 参数如下:
-gc:统计 jdk gc时 heap信息,以使用空间字节数表示
-gcutil:统计 gc时, heap情况,以使用空间的百分比表示
-class:统计 class loader行为信息
-compile:统计编译行为信息
-gccapacity:统计不同 generations(新生代,老年代,持久代)的 heap容量情况
-gccause:统计引起 gc的事件
-gcnew:统计 gc时,新生代的情况
-gcnewcapacity:统计 gc时,新生代 heap容量
-gcold:统计 gc时,老年代的情况
-gcoldcapacity:统计 gc时,老年代 heap容量
-gcpermcapacity:统计 gc时, permanent区 heap容量
jstat使用示例
示例 1:jstat -gc 15 5000 5
每5秒一次显示进程号为15的java进程的GC情况,每5S生成异常,一共生成5次。
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
307200.0 307200.0 24333.5 0.0 2457600.0 945456.5 5120000.0 3462367.2 241360.0 209218.1 26120.0 20538.3 6642 531.164 20 6.874 538.038
307200.0 307200.0 24333.5 0.0 2457600.0 945513.4 5120000.0 3462367.2 241360.0 209218.1 26120.0 20538.3 6642 531.164 20 6.874 538.038
307200.0 307200.0 24333.5 0.0 2457600.0 968130.4 5120000.0 3462367.2 241360.0 209218.1 26120.0 20538.3 6642 531.164 20 6.874 538.038
307200.0 307200.0 24333.5 0.0 2457600.0 1394418.3 5120000.0 3462367.2 241360.0 209218.1 26120.0 20538.3 6642 531.164 20 6.874 538.038
307200.0 307200.0 24333.5 0.0 2457600.0 1867238.5 5120000.0 3462367.2 241360.0 209218.1 26120.0 20538.3 6642 531.164 20 6.874 538.038
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
单位:KB
我可以计算出如下核心数据:
- 第一个幸存区的大小S0C:300M
- 第二个幸存区的大小S1C:300M
- 伊甸园区的大小EC:2400M
- 老年代大小OC:5000M
- 方法区大小MC:236M
- 年轻代垃圾回收消耗时间YGCT:531.164(单位?)
- 老年代垃圾回收消耗时间FGCT:6.874(单位?)
我们再看输出的GC日志:
Heap before GC invocations=6641 (full 10):
par new generation total 2764800K, used 2492979K [0x00000005cc000000, 0x0000000687800000, 0x0000000687800000)
eden space 2457600K, 100% used [0x00000005cc000000, 0x0000000662000000, 0x0000000662000000)
from space 307200K, 11% used [0x0000000674c00000, 0x0000000676e8cc90, 0x0000000687800000)
to space 307200K, 0% used [0x0000000662000000, 0x0000000662000000, 0x0000000674c00000)
concurrent mark-sweep generation total 5120000K, used 3462278K [0x0000000687800000, 0x00000007c0000000, 0x00000007c0000000)
Metaspace used 209218K, capacity 229352K, committed 241360K, reserved 1265664K
class space used 20538K, capacity 24038K, committed 26120K, reserved 1048576K
343501.719: [GC (Allocation Failure) 343501.719: [ParNew: 2492979K->24333K(2764800K), 0.0261186 secs] 5955257K->3486700K(7884800K), 0.0262698 secs] [Times: user=0.05 sys=0.01, real=0.03 secs]
可以计算出如下核心数据:
- 第一个幸存区的大小S0C:300M
- 第二个幸存区的大小S1C:300M
- 伊甸园区的大小EC:2400M
- 老年代大小OC:从这里计算不出来
- 方法区大小MC:从这里...
2 条评论
回复