JVM笔记八:Sun JDK监控和故障处理工具

文章目录
  1. 1. jps:虚拟机线程状况工具
  2. 2. jstat:虚拟机统计信息监视工具
  3. 3. jinfo:Java配置信息工具
  4. 4. jmap:Java内存映像工具
  5. 5. jhat:虚拟机堆转储快照分析工具
  6. 6. jstack:Java堆栈跟踪工具

Sun JDK监控和故障处理工具:

名称 主要作用
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:虚拟机线程状况工具

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

🌰 查看线程51710线程垃圾收集情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
➜  ~ jstat -gc 51710 250 5
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
24576.0 46592.0 24077.9 0.0 773632.0 109440.9 139776.0 50009.5 34560.0 33710.1 4096.0 3911.8 10 0.191 1 0.052 0.243
24576.0 46592.0 24077.9 0.0 773632.0 109440.9 139776.0 50009.5 34560.0 33710.1 4096.0 3911.8 10 0.191 1 0.052 0.243
24576.0 46592.0 24077.9 0.0 773632.0 109440.9 139776.0 50009.5 34560.0 33710.1 4096.0 3911.8 10 0.191 1 0.052 0.243
24576.0 46592.0 24077.9 0.0 773632.0 109440.9 139776.0 50009.5 34560.0 33710.1 4096.0 3911.8 10 0.191 1 0.052 0.243
24576.0 46592.0 24077.9 0.0 773632.0 109440.9 139776.0 50009.5 34560.0 33710.1 4096.0 3911.8 10 0.191 1 0.052 0.243
➜ ~ jstat -gcutil 51710 250 5
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
97.97 0.00 14.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243
97.97 0.00 14.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243
97.97 0.00 14.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243
97.97 0.00 14.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243
97.97 0.00 14.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243
➜ ~ jstat -gccause 51710 250 5
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
97.97 0.00 15.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243 Allocation Failure No GC
97.97 0.00 15.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243 Allocation Failure No GC
97.97 0.00 15.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243 Allocation Failure No GC
97.97 0.00 15.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243 Allocation Failure No GC
97.97 0.00 15.15 35.78 97.54 95.50 10 0.191 1 0.052 0.243 Allocation Failure No GC
说明 jstat参数
S0C 输出Survivor0空间的大小,单位KB -gc
-gccapacity
-gcnew
-gcnewcapacity
S1C 输出Survivor1空间的大小。单位KB -gc
-gccapacity
-gcnew
-gcnewcapacity
S0U 输出Survivor0已用空间的大小。单位KB -gc
-gcnew
S1U 输出Survivor1已用空间的大小。单位KB -gc
-gcnew
EC 输出Eden空间的大小。单位KB。 -gc
-gccapacity
-gcnew
-gcnewcapacity
EU 输出Eden已用空间的大小。单位KB -gc
-gcnew
OC 输出老年代空间的大小。单位KB -gc
-gccapacity
-gcold
-gcoldcapacity
OU 输出老年代已用空间的大小。单位KB -gc
-gcold
PC 输出持久代空间的大小。单位KB -gc
-gccapacity
-gcold
-gcoldcapacity
-gcpermcapacity
PU 输出持久代已用空间的大小。单位KB -gc
-gcold
YGC 新生代空间GC时间发生的次数 -gc
-gccapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccause
YGCT 新生代GC处理花费的时间。
-gc
-gcnew
-gcutil
-gccause
FGC full GC发生的次数。 -gc
-gccapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccause
FGCT full GC操作花费的时间 -gc
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccause
GCT GC操作花费的总时间。 -gc
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccause
NGCMN 新生代最小空间容量,单位KB -gccapacity
-gcnewcapacity
NGCMX 新生代最大空间容量,单位KB -gccapacity
-gcnewcapacity
NGC 新生代当前空间容量,单位KB -gccapacity
-gcnewcapacity
OGCMN 老年代最小空间容量,单位KB -gccapacity
-gcoldcapacity
OGCMX 老年代最大空间容量,单位KB -gccapacity
-gcoldcapacity
OGC 老年代当前空间容量制,单位KB -gccapacity
-gcoldcapacity
PGCMN 持久代最小空间容量,单位KB -gccapacity
-gcpermcapacity
PGCMX 持久代最大空间容量,单位KB -gccapacity
-gcpermcapacity
PGC 持久代当前空间容量,单位KB -gccapacity
-gcpermcapacity
PC 持久代当前空间大小,单位KB -gccapacity
-gcpermcapacity
PU 持久代当前已用空间大小,单位KB -gc
-gcold
LGCC 最后一次GC发生的原因 -gccause
GCC 当前GC发生的原因 -gccause
TT 老年化阈值。被移动到老年代之前,在新生代空存活的次数。 -gcnew
MTT 最大老年化阈值。被移动到老年代之前,在新生代空存活的次数。 -gcnew
DSS 幸存者区所需空间大小,单位KB -gcnew

jinfo:Java配置信息工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  ~ jinfo -flag CICompilerCount  51710
-XX:CICompilerCount=4

➜ ~ jinfo -sysprops 51710
Attaching to process ID 51710, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
java.vendor = Oracle CorporationUnnamed_LJS-2
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
catalina.useNaming = true
os.name = Mac OS X
...
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
file.encoding = US-ASCII
java.specification.version = 1.8

jmap: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
➜  ~ jmap -dump:format=b,file=idea.bin 51710
Dumping heap to /Users/larry/idea.bin ...
Heap dump file created

➜ ~ jmap -heap 51710
...
using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 89128960 (85.0MB)
MaxNewSize = 1431306240 (1365.0MB)
OldSize = 179306496 (171.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
capacity = 819462144 (781.5MB)
used = 155157104 (147.96934509277344MB)
free = 664305040 (633.5306549072266MB)
18.93401728634337% used
From Space:
capacity = 47710208 (45.5MB)
used = 0 (0.0MB)
free = 47710208 (45.5MB)
0.0% used
To Space:
capacity = 49283072 (47.0MB)
used = 0 (0.0MB)
free = 49283072 (47.0MB)
0.0% used
PS Old Generation
capacity = 131072000 (125.0MB)
used = 30525568 (29.1114501953125MB)
free = 100546432 (95.8885498046875MB)
23.28916015625% used

18359 interned Strings occupying 2261944 bytes.

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

1
2
3
4
5
6
7
8
9
10
➜  ~ jhat idea.bin
Reading from idea.bin...
Dump file created Mon Mar 13 16:54:15 CST 2017
Snapshot read, resolving...
Resolving 968447 objects...
Chasing references, expect 193 dots.................................................................................................................................................................................................
Eliminating duplicate references.................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

分析结果默认是以包为单位进行分组显示,分析内存漏洞问题主要会用到其中的『Heap Histogram』(与jmap -histo功能一样)与OQL页签的功能。

jstack:Java堆栈跟踪工具

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

jstack -l 72980
2017-03-20 11:16:49
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.65-b01 mixed mode):

"Attach Listener" #52 daemon prio=9 os_prio=31 tid=0x00007fc9ae8bc800 nid=0x9303 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"http-nio-8080-exec-7" #51 daemon prio=5 os_prio=31 tid=0x00007fc9cc1ac000 nid=0x9103 waiting on condition [0x0000700005057000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006c0913a10> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

Locked ownable synchronizers:
- None