JVM命令总结

jps

Java版的ps命令,查看java进程及其相关的信息,如果你想找到一个java进程的pid,那可以用jps命令替代linux中的ps命令了,简单而方便。

命令格式:

jps [options] [hostid]

options参数解释:

  • -l : 输出主类全名或jar路径
  • -q : 只输出LVMID
  • -m : 输出JVM启动时传递给main()的参数
  • -v : 输出JVM启动时显示指定的JVM参数

最常用示例:

1
2
3
jps -l 输出jar包路径,类全名
jps -m 输出main参数
jps -v 输出JVM参数

jinfo

jinfo是用来查看JVM参数和动态修改部分JVM参数的命令

命令格式:

jinfo [option]

options参数解释:

  • -flag 打印指定名称的参数
  • -flag [+|-] 打开或关闭参数
  • -flag = 设置参数
  • -flags 打印所有参数
  • -sysprops 打印系统配置
  • 打印上面两个选项

最常用示例:

其中11666为pid

查看JVM参数和系统配置

1
2
3
jinfo 11666 
jinfo -flags 11666
jinfo -sysprops 11666

查看打印GC日志参数

1
2
jinfo -flag PrintGC 11666 
jinfo -flag PrintGCDetails 11666

打开GC日志参数

1
2
jinfo -flag +PrintGC 11666 
jinfo -flag +PrintGCDetails 11666

关闭GC日志参数

1
2
jinfo -flag -PrintGC 11666 
jinfo -flag -PrintGCDetails 11666

还可以使用下面的命令查看那些参数可以使用jinfo命令来管理:

1
java -XX:+PrintFlagsFinal -version | grep manageable

常用JVM参数:

-Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
-Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:”-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。
-XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。

jstack

jstack是用来查看JVM线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈集合。使用jstack命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环等。jstack还可以查看程序崩溃时生成的core文件中的stack信息。

命令格式:

jstack [-l] (连接运行中的进程)
jstack -F [-m] [-l] (连接挂起的进程)
jstack [-m] [-l] (连接core文件)
jstack [-m] [-l] [server_id@] (连接远程debug服务器)

option参数解释:

  • -F 当使用jstack 无响应时,强制输出线程堆栈。
  • -m 同时输出java和本地堆栈(混合模式)
  • -l 额外显示锁信息

常用示例:

1
jstack -l 11666 | more

jmap

jmap是用来生成堆dump文件和查看堆相关的各类信息的命令,例如查看finalize执行队列,heap的详细信息和使用情况。

命令格式:

jmap [option] (连接正在执行的进程)
jmap [option] <executable (连接一个core文件)
jmap [option] [server_id@] (链接远程服务器)

option参数解释:

  • to print same info as Solaris pmap
  • -heap 打印java heap摘要
  • -histo[:live] 打印堆中的java对象统计信息
  • -clstats 打印类加载器统计信息
  • -finalizerinfo 打印在f-queue中等待执行finalizer方法的对象
  • -dump: 生成java堆的dump文件

      dump-options:

      live 只转储存活的对象,如果没有指定则转储所有对象

      format=b 二进制格式

      file= 转储文件到

  • -F 强制选项

常用示例:

1
jmap -dump:live,format=b,file=dump.hprof 11666

输出:

1
2
Dumping heap to /dump.hprof ...
Heap dump file created

这个命令是要把java堆中的存活对象信息转储到dump.hprof文件

1
jmap -finalizerinfo 11666

输出:

1
2
3
4
5
Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Number of objects pending for finalization: 0

输出结果的含义为当前没有在等待执行finalizer方法的对象

1
jmap -heap 11666 #jhsdb jmap --heap --pid 1 已换为

输出堆的详细信息

输出:

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
Attaching to process ID 11666, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02

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

Heap Configuration: //堆内存初始化配置
MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 1073741824 (1024.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 22020096 (21.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的新生代的默认大小
MaxNewSize = 357564416 (341.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的新生代的最大大小
OldSize = 45088768 (43.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的老年代的大小
NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:新生代和老生代的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置新生代中Eden区与Survivor区的大小比值
MetaspaceSize = 21807104 (20.796875MB) // 元数据区大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) //类压缩空间大小
MaxMetaspaceSize = 17592186044415 MB //元数据区最大大小
G1HeapRegionSize = 0 (0.0MB) //G1垃圾收集器每个Region大小

Heap Usage: //堆内存使用情况
PS Young Generation
Eden Space: //Eden区内存分布
capacity = 17825792 (17.0MB) //Eden区总容量
used = 12704088 (12.115562438964844MB) //Eden区已使用
free = 5121704 (4.884437561035156MB) //Eden区剩余容量
71.26801434685203% used //Eden区使用比率
From Space: //其中一个Survivor区的内存分布
capacity = 2097152 (2.0MB)
used = 1703936 (1.625MB)
free = 393216 (0.375MB)
81.25% used
To Space: //另一个Survivor区的内存分布
capacity = 2097152 (2.0MB)
used = 0 (0.0MB)
free = 2097152 (2.0MB)
0.0% used
PS Old Generation
capacity = 52428800 (50.0MB) //老年代容量
used = 28325712 (27.013504028320312MB) //老年代已使用
free = 24103088 (22.986495971679688MB) //老年代空闲
54.027008056640625% used //老年代使用比率

15884 interned Strings occupying 2075304 bytes.
1
jmap -histo:live 11666 | ``more

输出存活对象统计信息

输出:

1
2
3
4
5
6
7
num     #instances         #bytes  class name
----------------------------------------------
1: 46608 1111232 java.lang.String
2: 6919 734516 java.lang.Class
3: 4787 536164 java.net.SocksSocketImpl
4: 15935 497100 java.util.concurrent.ConcurrentHashMap$Node
5: 28561 436016 java.lang.Object

jhat

jhat是用来分析jmap生成dump文件的命令,jhat内置了应用服务器,可以通过网页查看dump文件分析结果,jhat一般是用在离线分析上。

命令格式:

1
jhat [option] [dumpfile]

option参数解释:

  • -stack false: 关闭对象分配调用堆栈的跟踪
  • -refs false: 关闭对象引用的跟踪
  • -port : HTTP服务器端口,默认是7000
  • -debug : debug级别

   0: 无debug输出

   1: Debug hprof file parsing

   2: Debug hprof file parsing, no server

  • -version 分析报告版本

常用示例:

1
jhat dump.hprof

jstat

输入:jstat -option得到以下选项

1
2
3
4
5
6
7
8
9
10
11
12
13
# jstat -options
-class // 显示类加载信息
-compiler // 显示编译信息
-gc // 显示GC相关信息
-gccapacity // 显示各区域容量及使用情况
-gccause // 显示垃圾回收信息
-gcmetacapacity // 显示元空间容量信息
-gcnew // 显示新生代信息
-gcnewcapacity // 显示新生代容量信息
-gcold // 显示老年代信息
-gcoldcapacity // 显示老年代容量信息
-gcutil // 显示垃圾收集信息
-printcompilation // 显示JIT编译的方法信息

class 类加载统计

1
2
3
4
5
6
7
8
9
# jstat -class 1
Loaded Bytes Unloaded Bytes Time
28364 50234.7 1164 1187.9 69.24

Loaded:加载class的数量
Bytes:所占用空间大小
Unloaded:未加载数量
Bytes:未加载占用空间
Time:时间

compiler编译统计

1
2
3
4
5
6
7
8
9
jstat -compiler 1
Compiled Failed Invalid Time FailedType FailedMethod
34529 0 0 166.27 0
Compiled:编译数量。
Failed:失败数量
Invalid:不可用数量
Time:时间
FailedType:失败类型
FailedMethod:失败的方法

gc垃圾回收统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# jstat -gc 1
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数+
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

image-20201022151454107

gccapacity堆内存统计

image-20201022151728763

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数

gcnew新生代垃圾回收统计

image-20201022152045329

1
2
3
4
5
6
7
8
9
10
11
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间

gcnewcapacity新生代内存统计

image-20201022152219560

1
2
3
4
5
6
7
8
9
10
11
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数

gcold老年代垃圾回收统计

image-20201022152336027

1
2
3
4
5
6
7
8
9
10
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

gcoldcapacity老年代内存统计

image-20201022152412129

1
2
3
4
5
6
7
8
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

gcutil垃圾收集信息

1
jstat -gcutil 1 2s 3  # 查看pid为1 每2秒更新显示一次 共显示3次 垃圾收集信息
1
2
3
4
5
6
7
8
9
10
11
统计列含义
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

jconsole, jvisualvm

除了以上所述的常用命令行工具之外还有图形化工具,使用上比较简单。在命令行下执行jconsole和jvisualvm即可。具体的用法,自己去点一点就了解了。

jconsole:

image-20201022155114797

jvisualvm

image-20201022155138061