(三)虚拟机性能监控与故障处理工具

虚拟机性能监控与故障处理工具

本节主要介绍:虚拟机性能监控与故障处理的一些工具

JDK的命令行工具

JDK中已经提供了大量的工具让开发人员去使用,这些工具都在bin中,基本很小,主要是对tool.jar的一层封装,而tool.jar是用java代码来实现的。

为什么使用java代码来实现监控工具?

当服务器部署后,无论直接操作服务器主机还是远程连接,都会变得比较麻烦。
而tool.jar可以直接实现在代码中无缝的使用

常用的工具

研究常见的工具的使用。主要有下面工具:

  • jps—JVM Process Status tool,显示指定系统内所有的HotSpot虚拟机进程
  • jstat—JVM Statistics Monitoring tool,用于收集HotSpot虚拟机各方面的运行数据
  • jinfo—Configuration Info For Java,显示虚拟机配置信息
  • jmap—Memory Map for Java,生成虚拟机的内存转储快照(heapdump文件)
  • jhat—JVM Heap Dump Browser,用于分析heapdump文件,它会建立一个http/html服务器。让用于可以在浏览器上查看分析结果
  • jstack—Stack Trace For Java,显示虚拟机的线程快照。

jps:虚拟机进程状况工具

1
2
3
4
5
6
7
8
9
10
11
12
13
jps [option] [hostid]

-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传递给主类main函数的参数
-l 输出主类的全名,如果进程执行的是jar包,输出Jar路径
-v 输出虚拟机进程启动时JVM参数

jps -l
16208 sun.tools.jps.Jps
10244 org.jetbrains.jps.cmdline.Launcher
12728 org/netbeans/Main
19608 org.jetbrains.jps.cmdline.Launcher
7756

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

-class  监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc  监视java堆状况,包括Eden区、两个suprivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息(实际在hotspot虚拟机中,永久代不属于堆内存,而且在JDK8已经被元空间MetaSpace所取代)
-gccapacity  监视内容与-gc基本相同,但是输出主要关注的是Java堆各个区域使用的最大、最小空间
-gcutil  监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的比例
-gccause  监视内容与-gc基本相同,但是会额外输出导致上一致gc的原因。
-gcnew  监视新生代GC状况
-gcnewcapacity  监视内容与-gcnew基本相同,但是输出主要关注的是使用的最大、最小空间
-gcold  监视老年代GC状况
-gcoldcapacity  监视内容与-gcold基本相同,但是输出主要关注的是使用的最大、最小空间
-gcpermcapacity  输出永久代最大、最小空间
-compiler  输出JIT编译过的方法、耗时等信息
-printcompilation  输出已经被JIT编译的方法

jstat -gcutil 2204
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 33.52 54.34 55.99 15 0.322 1 0.282 0.604

S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制

jinfo:Java配置信息工具

作用是 实时查看和调整虚拟机的各项参数

使用jps -v 可以查看虚拟器启动时候显示指定的参数列表,但是如果想查找未被显示指定的参数的系统的默认值,除了去查阅资料,就只能使用jinfo的 -flag选项进行查询了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
jinfo -help
Usage:
jinfo [option] <pid>
(to connect to running process)
jinfo [option] <executable <core>
(to connect to a core file)
jinfo [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)

where <option> is one of:
-flag <name> to print the value of the named VM flag
-flag [+|-]<name> to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
-flags to print VM flags
-sysprops to print Java system properties
<no option> to print both of the above
-h | -help to print this help message

jinfo 2084
Attaching to process ID 2084, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.80-b11
Java System Properties:

java.vendor = Oracle Corporation
osgi.bundles.defaultStartLevel = 4
org.eclipse.debug.ui.breakpoints.toggleFactoriesUsed = false
org.osgi.supports.framework.extension = true
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
eclipse.p2.profile = epp.package.jee
os.name = Windows 8

jmap:Java内存映像工具

  1. 用于生成堆转储快照(一般称为heapdump或dump文件)
  2. 还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前使用的是哪种收集器等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
jmap -help
Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)

where <option> is one of:
<none> to print same info as Solaris pmap
-heap to print java heap summary
-histo[:live] to print histogram of java object heap; if the "live"
suboption is specified, only count live objects
-clstats to print class loader statistics
-finalizerinfo to print information on objects awaiting finalization
-dump:<dump-options> to dump java heap in hprof binary format
dump-options:
live dump only live objects; if not specified,
all objects in the heap are dumped.
format=b binary format
file=<file> dump heap to <file>
Example: jmap -dump:live,format=b,file=heap.bin <pid>
-F force. Use with -dump:<dump-options> <pid> or -histo
to force a heap dump or histogram when <pid> does not
respond. The "live" suboption is not supported
in this mode.
-h | -help to print this help message
-J<flag> to pass <flag> directly to the runtime system

jmap -dump:live,format=b,file=heap.bin 2204
Dumping heap to C:\Users\Administrator\heap.bin ...
Heap dump file created

jmap -heap 2084  #查看堆内存
Attaching to process ID 2084, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.80-b11

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
MinHeapFreeRatio = 0
.......

Heap Usage:
PS Young Generation
Eden Space:
.......

jhat:虚拟机堆转储快照分析工具

jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个小型的HTTP/HTML分析器,生成dump文件的分析结果之后,可以在浏览器查看。

1
2
3
4
5
6
7
8
9
10
jhat heap.bin
Reading from heap.bin...
Dump file created Mon Dec 03 15:04:02 CST 2018
Snapshot read, resolving...
Resolving 816411 objects...
Chasing references, expect 163 dots...................................................................................................................................................................
Eliminating duplicate references...................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

输入http://localhost:7000/ 即可查看分析信息

jstack:java堆栈跟踪工具

jstack(Stack Trace For Java)命令用于生成虚拟机当前时刻的线程快照(一般成为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的是为了定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源等待的时间过长等原因。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
jstack
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)

Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message

jstack -l 2204

在JDK1.5中,java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个对象可以通过简单的几行代码就完成jstack的大部分功能,在实际项目中可以用这个做管理界面,可随时查看线程堆栈。

可视化工具的使用

JDK除了上面的大量的命令行工具,还提供了两个可视化工具,JConsole和Visual VM。JConsole是JDL5才有的,而Visual VM是JDK6的Update7中首次发布的,现在已经成为主流的多合一故障处理工具。

本文标题:(三)虚拟机性能监控与故障处理工具

文章作者:Sun

发布时间:2019年10月16日 - 19:10

最后更新:2019年11月04日 - 14:11

原始链接:https://sunyi720.github.io/2019/10/16/JVM/(三)虚拟机性能监控与故障处理工具/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。