JVM调试指令

JVM调试指令

关于JVM的一些相关指令,记录下来用于调试,同时往后会有补充使用示例

  • jps(Java Virtual Machine Process Status Tool)

jps主要用来输出JVM中运行的进程状态信息

1
jps [options] [hostid]

options选项说明

1
2
3
4
-q 不输出类名,Jar包和传入main方法的参数
-m 输出传入main方法的参数
-l 输出mian类或Jar的全限名
-v 输出传入JVM的参数
  • jstack

jstack主要用来查看某个Java进程内的线程堆栈信息

1
jstack

options选项说明

1
2
3
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-l (long listings)打印出额外的锁信息,在发生死锁时可以用jstack -l pid 来观察锁持有情况
-m (mix mode)混合模式,不仅输出Java堆栈信息,还会输出C/C++堆栈信息
  • jmap (Java Memory Map)

jmap查看堆内存使用情况,用于显示当前Java堆和永久代的详细信息

1
2
3
jmap [options] pid
jmap [options] executable core
jmap [options] [server-id@remote-hostaname-or-ip]

options选项说明

1
2
3
4
5
6
-dump 生成Java堆转储快照
-heap 显示Java堆详细信息
-F 如果对-dump没有反应,则该选项强制生成堆转储快照
-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-histo 显示堆中对象统计信息
-permstat 以ClassLoader为统计口径显示永久代内存状态

假设一个Java进程pid: 123

查看堆详细信息:jmap -heap 123

生成dump文件:jmap -dump:file=~/java/dump/test.prof 123

查看当前堆中对象统计信息:jmap -histo 123

  • jhat (Java Heap Analysis Tool)

用于分析使用jmap生成的dump文件,是JDK自带的工具

1
jhat -J -Xmx512m [file]
  • jstat (Java Virtual Machine Statistics Monitoring Tool)

用于监视虚拟机运行时状态信息的命令,可以显示虚拟机进程中的类装载,内存,垃圾收集,JIT编译

1
jstat [options] vmid [insterval] [count]

[options] 操作参数选项说明

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
-class 类加载的行为统计(包括类装载,卸载,及总空间和耗费时间
Loaded 加载class数量
Bytes class字节大小
Unloaded 未加载class数量
Bytes 未加载class大小
Time 加载时间

-compiler Hotpot JIT编译器行为统计
Compiled 编译数量
Failed 编译失败数量
Invalid 无效数量
Time 编译耗时
FailedType 失败类型
FailedMethod 失败方法的权限定名

-gc 垃圾回收堆的行为统计,包括Eden区,两个Survivor区,老年代,永久代容量,已用空间,GC时间等
S0C (Survivor 0 Capacity) Survivor 0 区的总容量
S1C (Survivor 1 Capacity) Survivor 1 区的总容量
S0U (Survivor 0 Used) Survivor 0 区的已使用容量
S1U (Survivor 1 Used) Survivor 1 区的已使用容量
EC (Eden Capacity) Eden区的总容量
EU (Eden Used) Eden区的已使用容量
OC (Old Capacity) Old区的总容量
OU (Old Used) Old区的已使用容量
MC (Method Capacity) 方法区总容量
MU (Method Used) 方法区已使用容量
CCSC (Compress Capacity Space Capacity) 压缩类空间容量
CCSU (Compress Capacity Space Used) 压缩类空间已使用容量
YGC (Younger GC) YoungerGC次数
YGCT (Youger GC Time) YoungerGC时间
FGC (Full GC) Full GC次数
FGCT (Full GC Time) Full GC 时间
GCT (GC Time) GC总时间

-gccapacity 与gc行为基本一致,不过更侧重于Java堆使用各个区域的最大最小空间
NGCMN (New Generation Capacity Mini) 新生代最小容量
NGCMX (New Generation Capacity Max) 新生代最大容量
NGC (New Generation Capacity) 当前新生代容量
S0C 同上
S1C 同上
EC 同上
OGCMN (Old Generation Capacity Mini) 老年代最小容量
OGCMX (Old Generation Capacity Max) 老年代最大容量
OGC (Old Genneration Capacity) 老年代总容量
OC (Old space Capacity) 当前老年代容量
MCMN (Meta Capacity Mini) 元数据区最小容量
MCMX (Meta Capacity Max) 元数据区最大容量
MC (Meta Capacity) 元数据区大小
CCSMN (Compress Class Space Mini) 压缩类空间最小容量
CCSMX (Compress Class Space Max) 压缩类空间最大容量
CCSC (Compress Class Space Capacity) 当前压缩类空间大小
YGC 同上
FGC 同上

-gcutil 与gc行为基本一致,不过更关注已使用空间占总空间的百分比
S0 Survivor 0 区
S1 Survivor 1 区
E Eden 区
O Old 区
M Meta 区
CCS 压缩类空间
YGC Younger GC 次数
YGCT Younger GC 时间
FGC Full GC 次数
FGCT Full GC 时间
GCT GC 时间

-gccause 与gcutil功能一样,但会额外输出上一次GC产生的原因
列出参数基本一致
LGCC (Last GC Cause) 引起上一次GC的原因

-gcnew 监视新生代GC状况
TT (Tenuring threshold) 晋升阀值(即对象在新生代存活的次数:以一次YoungerGC为一次)
MTT (Max Tenuring threshold) 最大晋升阀值
DSS (Desired Survivor Size) 期望的Survivor区大小

-gcnewcapacity 与gcnew基本一致,但更关注新生代的相应空间
-gcold 监视老年代GC状况(java8 已经移除了永久代)
-gcoldcapacity 与gcold基本一致,但更关注老年代的相应空间
-printcompilation 输出已被JIT编译的方法

jstat -gc pid

-gc选项

jstat -gccapacity 11685

-gccapacity

jstat -gcutil 11685

-gcutil

jstat -gccause 11685

-gccause

jstat -gcnew 11685

-gcnew

jstat -gcnewcapacity 11685

-gcnewcapacity

-------------本文结束感谢您的阅读-------------