jmap 用于生成 heap dump 文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError
参数来让虚拟机出现 OOM 的时候自动生成 dump 文件。
jmap 不仅可以生成 dump 文件,还可以查询finalize
执行队列、Java 堆的详细信息,如当前使用率、当前使用的是哪种收集器等。
命令的使用格式如下。
jmap [option] LVMID
option 参数详解:
- dump : 生成堆转储快照
- finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
- heap : 显示Java堆详细信息
- histo : 显示堆中对象的统计信息
- clstats : 显示类加载器信息
- F : 当-dump没有响应时,强制生成dump快照
选项 | 作用 |
---|---|
-dump | 生成java堆转储快照,格式为dump:[live,]format=b,file=,其中live子参数指定是否只dump出存活对象。 |
-finalizerinfo | 显示在F-Queue中等待Finerlizer线程执行 finalize方法的对象,只在linux/Solaries 平台下有效 |
-heap | 显示java堆详细信息,包括使用哪种垃圾收集器、参数配置、分代状况等,只在linux/Solaries 平台下有效 |
-permstat | 以ClassLoader 为统计口径显示永久代内存状态,只在linux/Solaries 平台下有效 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
-F | 当虚拟机进程对 -dump 选项没有响应时,可使用这个选项强制生成dump快照,只在linux/Solaries 平台下有效 |
option 参数使用如下。
1、示例参数:dump
-dump
参数用于生成堆内存快照文件。
命令的使用格式如下。
-dump::live,format=b,file=<filename> pid
option 参数详解:
- live : 指的是活着的对象
- format : 表示指定的输出格式
- file : 表示指定的文件名
- pid : 表示 Java 服务进程ID
在操作系统终端输入如下命令,即可查看相关信息,示例如下。
$ jmap -dump:live,format=b,file=dump.hprof 20094
Dumping heap to /xxx/dump.hprof ...
Heap dump file created
dump.hprof
这个后缀是为了后续可以直接用 MAT (Memory Anlysis Tool) 工具打开。
2、示例参数:finalizerinfo
-finalizerinfo
参数用于打印等待回收对象的信息。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。
$ jmap -finalizerinfo 20094
Attaching to process ID 20094, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08
Number of objects pending for finalization: 0
从日志中可以得出,当前 F-QUEUE 队列中并没有等待 Finalizer 线程执行 finalizer 方法的对象。
3、示例参数:heap
-heap
参数用于打印 heap 的概要信息,GC 使用的算法,heap 的配置及 wise heap 的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。
$ jmap -heap 20094
Attaching to process ID 20094, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08using thread-local object allocation.
Mark Sweep Compact GCHeap Configuration:MinHeapFreeRatio = 40MaxHeapFreeRatio = 70MaxHeapSize = 461373440 (440.0MB)NewSize = 9764864 (9.3125MB)MaxNewSize = 153747456 (146.625MB)OldSize = 19595264 (18.6875MB)NewRatio = 2SurvivorRatio = 8MetaspaceSize = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize = 17592186044415 MBG1HeapRegionSize = 0 (0.0MB)Heap Usage:
New Generation (Eden + 1 Survivor Space):capacity = 17825792 (17.0MB)used = 239848 (0.22873687744140625MB)free = 17585944 (16.771263122558594MB)1.345511043772978% used
Eden Space:capacity = 15859712 (15.125MB)used = 239848 (0.22873687744140625MB)free = 15619864 (14.896263122558594MB)1.5123099334969008% used
From Space:capacity = 1966080 (1.875MB)used = 0 (0.0MB)free = 1966080 (1.875MB)0.0% used
To Space:capacity = 1966080 (1.875MB)used = 0 (0.0MB)free = 1966080 (1.875MB)0.0% used
tenured generation:capacity = 39444480 (37.6171875MB)used = 23665256 (22.568946838378906MB)free = 15779224 (15.048240661621094MB)59.99636958073728% used21919 interned Strings occupying 2683112 bytes.
从日志中,可以很清楚的看到 Java 堆中各个区域目前的情况。
4、示例参数:histo
-histo
参数用于打印堆的对象统计,包括对象数、内存大小等等。也可以带上live
参数,比如-histo[:live]
表示只打印存活的对象,如果不加就是查询全部对象。
在操作系统终端输入如下命令,即可查看相关信息,部分示例如下。
$ jmap -histo 20094num #instances #bytes class name
----------------------------------------------1: 61030 8438336 [C2: 9918 2169120 [I3: 59981 1439544 java.lang.String4: 5112 1331136 [B5: 13532 1190816 java.lang.reflect.Method6: 10071 1125192 java.lang.Class7: 32196 1030272 java.util.concurrent.ConcurrentHashMap$Node8: 9593 572904 [Ljava.lang.Object;9: 15416 493312 java.util.HashMap$Node10: 12115 484600 java.util.LinkedHashMap$Entry...
其中class name
列指的是对象类型,部分内容详解:
B:byte C:char D:double F:float I:int J:long Z:boolean [I:表示 int[]的数组 [L+类名:其他数组对象
5、示例参数:clstats
-clstats
参数用于打印类加载器信息。
在操作系统终端输入如下命令,即可查看相关信息,部分示例如下。
$ jmap -clstats 20094
Attaching to process ID 20094, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08
表示当前并没有相关类加载的信息。
6、示例参数:F
-F
参数表示强制模式。在 pid 没有响应的时候使用-dump
或者-histo
参数,在这个模式下live
子参数会无效。