JVM调优前戏之JDK命令行工具---jmap

在JDK的命令行中,一般开发人员最耳熟能详的肯定就是java,javac,javap等常用命令,不过在jdk/bin下还有许多其他的命令行工具,它们被用来监测JVM运行时的状态,下面我们来详细解读一下几个常用的工具以及如何使用。


jmap

jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,还阔以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。
jmap不仅能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。

命令格式

jmap [option] LVMID

option参数

  • -dump : 生成堆转储快照
  • -finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • -heap : 显示Java堆详细信息
  • -histo : 显示堆中对象的统计信息
  • -clstats : 显示元空间内存状态,ps:该口令是JDK8开始使用,之前是-permstat
  • -F : 当-dump没有响应时,强制生成dump快照

示例

-dump

1
2
3
$ jmap -dump:live,format=b,file=dump.hprof 45995
Dumping heap to /Users/apple/dump.hprof ...
Heap dump file created

live表示只dump出当前存活的对象,dump.hprof这个后缀是为了后续可以直接用MAT(Memory Anlysis Tool)打开。

-finalizerinfo

1
2
3
4
5
6
$ jmap -finalizerinfo 45995
Attaching to process ID 45995, please wait....
Debugger attached successfully.
Server compiler detected.
JVM version is 25.45-b02
Number of objects pending for finalization:0.

可以看到当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象。

-heap

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
$ jmap -heap 45995
ttaching to process ID 45995, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.45-b02

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 = 527433728 (503.0MB)
used = 15639632 (14.915115356445312MB)
free = 511794096 (488.0848846435547MB)
2.9652316812018515% used
From Space:
capacity = 57147392 (54.5MB)
used = 0 (0.0MB)
free = 57147392 (54.5MB)
0.0% used
To Space:
capacity = 56623104 (54.0MB)
used = 0 (0.0MB)
free = 56623104 (54.0MB)
0.0% used
PS Old Generation
capacity = 153092096 (146.0MB)
used = 36103888 (34.43135070800781MB)
free = 116988208 (111.56864929199219MB)
23.583116923293023% used

可以很清楚的看到Java堆中各个区域目前的情况。

高能tips

jmap –histo:live LVMID
这个命令可以显示出当前存活的对象信息,不过加live关键字会强制做1次FULL GC,如果系统有watch dog的存在很可能导致服务器重启。

jmap -heap
这个命令在CMS下会有几率导致进程traced(中断),所以强烈建议不要在生产环境使用这个命令,如果想要查看堆使用情况可以用jstat。