JVM命令行性能监控工具

基于jdk1.8

1、在 java 的 bin 目录下,jdk 提供了很多使用的工具,下面学习一些监控和故障处理的工具。

名称 作用
jps JVM process status tool,显示指定系统内所有的 HotSpot 虚拟机进程
jstat JVM statistics monitoring tool,用于收集 HotSpot 虚拟机各方面的运行数据
jinfo 显示虚拟机配置信息
jmap 生产虚拟机的内存快照 dump 文件
jhat 分析 dump 文件
jstack 显示虚拟机的线程快照

2、jps 虚拟机进程状况工具

2.1、jps 的命令格式:

jps [options] [hostid]
jps 可以查看通过 rmi 协议查询开启了 rmi 服务的原创虚拟机进程状态,hostid 是 rmi 注册表中注册的主机。

# jps -l
5289 org.apache.catalina.startup.Bootstrap
5385 sun.tools.jps.Jps
2.2、jps 有如下主要的选项:
选项 作用
-q 只输出 LVMID,省略主类的名称
-m 输出虚拟机启动时候传递给 main 方法的参数
-l 输出类的全名
-v 输出虚拟机进程启动时 JVM 参数
-V 禁止输出传递给main方法的类名、JAR文件名和参数,只生成本地JVM标识符列表。
-Joption 将选项传递给JVM,其中option是Java应用程序启动程序引用页中描述的选项之一。例如,-J-Xms48m将启动内存设置为48 MB。

3、jstat 虚拟机统计信息监视工具

3.1、jstat 可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、 JIT 编译等运行数据。

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHIGDGJ
jstat 的命令格式:
jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]

generalOption
单个常规命令行选项-help或-options。请参见常规选项。

outputOptions
一个或多个输出选项,包括单个statOption,以及-t、-h和-J选项中的任何一个。请参见输出选项。

vmid
虚拟机标识符,它是指示目标JVM的字符串。一般语法如下:
[protocol:][//]lvmid[@hostname[:port]/servername]
vmid字符串的语法对应于URI的语法。vmid字符串可以是表示本地JVM的简单整数,也可以是指定通信协议、端口号和其他特定于实现的值的更复杂的构造。请参阅虚拟机标识符。

interval [s|ms]
以指定单位(秒或毫秒)表示的采样间隔。默认单位为毫秒。必须是正整数。指定时,jstat命令在每个间隔生成其输出。

count
要显示的样本数。默认值是无穷大,这会导致jstat命令显示统计信息,直到目标JVM终止或jstat命令终止。此值必须为正整数。

例如:查询 5289进程的虚拟机状况,并且每隔 1000 毫秒一次,显示 5 次。

# jstat -gcutil 5289 1000 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079
  0.00  99.77  30.24  21.96  96.92  94.88      3    0.079     0    0.000    0.079

注意:不要编写脚本来解析jstat命令的输出,因为在将来的版本中格式可能会改变。如果您编写了解析jstat命令输出的脚本,那么希望在该工具的未来版本中修改它们。

3.2、统计选项
选项 作用
class 显示有关类加载器行为的统计信息。
compiler 显示有关Java热点虚拟机实时编译器行为的统计信息。
gc 显示有关垃圾收集堆行为的统计信息。
gccapacity 显示有关各代及其相应空间的容量的统计信息。
gccause 显示有关垃圾收集统计信息的摘要(与-gcutil相同),其中包含上次和当前(如果适用)垃圾收集事件的原因。
gcnew 显示新生代行为的统计信息。
gcnewcapacity 显示有关新生代及其相应空间大小的统计信息。
gcold 显示有关旧生代行为的统计信息和元空间统计信息。
gcoldcapacity 显示有关旧生代大小的统计信息。
gcmetacapacity 显示有关元空间大小的统计信息。
gcutil 显示有关垃圾收集统计信息的摘要。
printcompilation 显示Java热点虚拟机编译方法统计信息。
3.3、输出列

-class option
类装入器统计信息。
Loaded:已加载的类数。
Bytes:加载的kBs数。
Unloaded:已卸载的类数。
Bytes:卸载的字节数。
Time:执行类加载和卸载操作所花费的时间。

-compiler option
Java热点虚拟机实时编译器统计信息。
Compiled:执行的编译任务数。
Failed:失败的编译任务数。
Invalid:无效的编译任务数。
Time:执行编译任务所花费的时间。
FailedType:上次编译失败的编译类型。
FailedMethod:上次编译失败的类名和方法。

-gc option
垃圾收集堆统计信息。
S0C:当前survivor 0容量(kB)。
S1C:当前survivor 1容量(kB)。
S0U:survivor 0利用率(kB)。
S1U:survivor 1利用率(kB)。
EC:当前eden空间容量(kB)。
EU:eden空间利用率(kB)。
OC:当前老年代空间容量(kB)。
OU:老年代利用率(kB)。
MC:元空间容量(kB)。
MU:元空间利用率(kB)。
CCSC:压缩类空间容量(kB)。
CCSU:使用的压缩类空间(kB)。
YGC:年轻代垃圾收集事件数。
YGCT:年轻代垃圾收集时间。
FGC:Full GC事件数。
FGCT:Full GC时间。
GCT:垃圾收集总时间。

-gccapacity option
内存池生成和空间容量。
NGCMN:最小新生代容量(kB)。
NGCMX:最大新生代容量(kB)。
NGC:当前新生代容量(kB)。
S0C:当前survivor 0容量(kB)。
S1C:当前survivor 1容量(kB)。
EC:当前的eden空间容量(kB)。
OGCMN:最小老年代容量(kB)。
OGCMX:最大老年代容量(kB)。
OGC:当前老年代容量(kB)。OGC = sum(all OC)
OC:当前老年代容量(kB)。
MCMN:最小元空间容量(kB)。
MCMX:最大元空间容量(kB)。
MC:元空间容量(kB)。
CCSMN:压缩类空间最小容量(kB)。
CCSMX:压缩类空间最大容量(kB)。
CCSC:压缩类空间容量(kB)。
YGC:年轻代GC事件的数量。
FGC: Full GC事件数。

-gccause option
此选项显示与-gcutil选项相同的垃圾收集统计信息摘要,但包含上一个垃圾收集事件和(如果适用)当前垃圾收集事件的原因。除了为-gcutil列出的列之外,此选项还添加以下列。
LGCC:上次垃圾收集的原因
GCC:当前垃圾收集的原因

-gcnew option
新一代统计数据。
S0C:当前survivor 0容量(kB)。
S1C:当前survivor 1容量(kB)。
S0U:survivor 0已使用空间(kB)。
S1U:survivor 1已使用空间(kB)。
TT:维持阈值。
MTT:最大寿命阈值。
DSS:所需幸存者大小(kB)。
EC:当前的eden空间容量(kB)。
EU:Eden已使用(kB)。
YGC:年轻代GC事件的数量。
YGCT: 年轻代垃圾收集时间。

-gcnewcapacity option
新一代空间大小统计。
NGCMN:最小新生代容量(kB)。
NGCMX:最大新生代容量(kB)。
NGC:当前新生代容量(kB)。
S0CMX:最大survivor 0容量(kB)。
S0C:当前survivor 0容量(kB)。
S1CMX:最大survivor 1容量(kB)。
S1C:当前survivor 1容量(kB)。
ECMX:最大eden空间容量(kB)。
EC:当前的eden空间容量(kB)。
YGC:年轻代GC事件的数量。
FGC:Full GC事件数。

-gcold option
旧代和元空间行为统计。
MC:元空间容量(kB)。
MU:元空间利用率(kB)。
CCSC:压缩类空间容量(kB)。
CCSU:使用的压缩类空间(kB)。
OC:当前旧空间容量(kB)。
OU:旧空间利用率(kB)。
YGC:年轻代GC事件的数量。
FGC:Full GC事件数。
FGCT:Full GC时间。
GCT:垃圾收集总时间。

-gcoldcapacity option
旧一代规模统计。
OGCMN:最小老年代容量(kB)。
OGCMX:最大老年代容量(kB)。
OGC:当前老年代容量(kB)。
OC:当前旧空间容量(kB)。
YGC:年轻代GC事件的数量。
FGC:完整GC事件数。
FGCT:Full GC垃圾收集时间。
GCT:垃圾收集总时间。

-gcmetacapacity option
元空间大小统计。
MCMN:最小元空间容量(kB)。
MCMX:最大元空间容量(kB)。
MC:元空间容量(kB)。
CCSMN:压缩类空间最小容量(kB)。
CCSMX:压缩类空间最大容量(kB)。
YGC:年轻代GC事件的数量。
FGC:Full GC事件数。
FGCT:垃圾收集时间已满。
GCT:垃圾收集总时间。

-gcutil option
垃圾收集统计的摘要。
S0:survivor 0的使用率占当前容量的百分比。
S1:survivor 1的使用空间占当前容量的百分比。
E: Eden空间使用空间占当前容量的百分比。
O: 老年代使用空间占当前容量的百分比。
M: 元空间利用率占当前容量的百分比。
CCS:压缩类空间已使用百分比。
YGC:年轻代GC事件的数量。
YGCT:年轻代垃圾收集时间。
FGC:Full GC事件数。
FGCT:Full GC收集时间。
GCT:垃圾收集总时间。

-printcompilation option
Java热点虚拟机编译器方法统计信息。
Compiled:由最近编译的方法执行的编译任务数。
Size:最近编译的方法的字节码字节数。
Type:最近编译的方法的编译类型。
Method:识别最近编译的方法的类名和方法名。类名使用斜线(/)而不是点(.)作为名称空间分隔符。方法名是指定类中的方法。这两个字段的格式与HotSpot-XX:+PrintCompilation选项一致。

4、jinfo 查看 java 配置信息工具

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [ servier-id ] remote-hostname-or-IP
选项
no-option
打印命令行标志和系统属性名称-值对。
-flag name
打印指定命令行标志的名称和值。
-flag [+|-]name
启用或禁用指定的布尔命令行标志。
-flag name=value
将指定的命令行标志设置为指定值。
-flags
打印传递给JVM的命令行标志。
-sysprops
将Java系统属性打印为名称-值对。
-h
打印帮助消息。
-help
打印帮助消息。

5、jmap 生产 java 内存 dump

jmap 除了可以生成 dump 文件外,还可以查询 finalize 执行队列,java 堆和永久代的详细信息,如空间使用率和当前用的是哪种收集器等。
具体的 jamp 如何操作部多介绍,看下面提供的说明,比较简单:

jmap [ options ] pid
jmap [ options ] executable core
jmap [ options ] [ pid ] server-id@ ] remote-hostname-or-IP
选项
<no option>
如果没有使用任何选项,jmap命令将打印共享对象映射。对于加载到目标JVM中的每个共享对象,将打印共享对象文件的起始地址、映射大小和完整路径。此行为类似于Oracle Solaris pmap实用程序。
-dump:[live,] format=b, file=filename
将hprof二进制格式的Java堆转储到文件名。live子选项是可选的,但是在指定时,只转储堆中的活动对象。要浏览堆转储,可以使用jhat(1)命令读取生成的文件。
-finalizerinfo
打印有关等待完成的对象的信息。
-heap
打印所用垃圾收集、头配置和按生成的堆使用情况的堆摘要。此外,还将打印实习字符串的数量和大小。
-histo[:live]
打印堆的直方图。对于每个Java类,都会打印对象数、内存大小(字节)和完全限定的类名。JVM内部类名以星号(*)前缀打印。如果指定了活动子选项,则仅计算活动对象。
-clstats
打印Java堆的类装入器统计信息。对于每个类装入器,都会打印其名称、活动程度、地址、父类装入器以及已装入的类的数量和大小。
-F
强制。当pid不响应时,将此选项与jmap-dump或jmap-histo选项一起使用。此模式不支持live子选项。
-h
打印帮助消息。
-help
打印帮助消息。
-Jflag
将标志传递给运行jmap命令的Java虚拟机。

6、jhat 虚拟机堆快照分析工具

我们可以使用 jhat 来分析 jmap 生成的 dump 文件

#jhat tmp.dump
Reading from tmp.dump...
Dump file created Sat May 09 17:10:52 CST 2015
Snapshot read, resolving...
Resolving 0 objects...
WARNING:  hprof file does not include java.lang.Class!
WARNING:  hprof file does not include java.lang.String!
WARNING:  hprof file does not include java.lang.ClassLoader!
Chasing references, expect 0 dots
Eliminating duplicate references
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

默认会开 7000 端口进行 web 访问。一般不使用这个命令来分析,会使用专业的工具来分析 dump 文件,如 eclipse memory analyzer 等。

7、jstack 分析 java 堆栈

jstack 用来生成当前时刻线程快照。

jstack [ options ] pid
jstack [ options ] executable core
jstack [ options ] [ server-id@ ] remote-hostname-or-IP
选项
-F
当jstack[-l]pid没有响应时,强制栈转储。
-l
长列表。打印有关锁的其他信息,例如拥有的java.util.concurrent ownable同步器的列表。请参阅位于的AbstractOwnableSynchronizer类描述
http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/AbstractOwnableSynchronizer.html
-m
打印一个混合模式堆栈跟踪,既有java也有本地C/C++框架。
-h
打印帮助消息。
-help
打印帮助消息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章