jmap命令简介

jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。除此以外,jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。

参数:

  • -dump           生成程序的内存转储快照,用法:-dump: [live,] format = b, file = {fileName}
  • -finalizerinfo  显示F-Queue中等待Finalizer线程执行finalize()的对象。(仅对Linux有效)
  • -heap           显示堆详细信息,包括哪种GC、参数配置、分代状况等
  • -histo          显示堆中对象统计信息,包括类、示例数量、合计容量
  • -permstat       以ClassLoader为统计口径显示永久代内存状态
  • -F              当虚拟机对-dump选项没有响应时,通过这个选项可以强制生成dump快照


手动dump jvm内存文件 :/apps/svr/jdk/bin/jmap -F -dump:live,format=b,file=heap.bin 12652

或者所有对象导出:/apps/svr/jdk/bin/jmap   -F -dump:format=b,file=heap.bin 106265 

 dump-options主要有:

  • live:只dump存活的对象,如果不加则会dump所有对象。
  • format=b:表示以二进制格式。
  • file=filepath:输出到某个文件中。

  命令:jmap -dump:live,format=b,file=文件名.txt Pid

#jmap -dump:live,format=b,file=44052_heap.bin 1

Java JVM内存分析工具 jmap_sed

sh-4.2$ jmap -dump:format=b,file=44051_heap.bin 1
Dumping heap to /apps/svr/app/44051_heap.bin ...
Heap dump file created 

 

1、jmap -histo[:live] <pid>

通过histo选项,打印当前java堆中各个对象的数量、大小。如果添加了live,只会打印活跃的对象。

2、jmap -dump:[live,]format=b,file=<filename> <pid>

通过-dump选项,把java堆中的对象dump到本地文件,然后使用MAT进行分析。如果添加了live,只会dump活跃的对象。

3、jmap -heap <pid>

通过-heap选项,打印java堆的配置情况和使用情况,还有使用的GC算法。

4、jmap -finalizerinfo <pid>

通过-finalizerinfo选项,打印那些正在等待执行finalize方法的对象。

5、jmap -permstat <pid>

通过-permstat选项,打印java堆永久代的信息,包括class loader相关的信息,和interned Strings的信息。

命令参数说明:

  • option:jmap命令的可选参数。如果没有指定这个参数,jinfo命令会显示Java虚拟机进程的内存映像信息,如下图:

Java JVM内存分析工具 jmap_jvm_02

  • pid:要打印配置信息的Java虚拟机的进程ID。

想要要获取运行的Java虚拟机进程的列表,可以使用ps命令(Linux系统中)或tasklist命令(Windows系统中),如果Java虚拟机进程没有在单独的docker实例中运行,可以使用jps命令。

option都有哪些参数呢?我们来看一下。

-heap

显示Java堆的如下信息:

  • 被指定的垃圾回收算法的信息,包括垃圾回收算法的名称和垃圾回收算法的详细信息。
  • 堆的配置信息,可能是由命令行选项指定,或者由Java虚拟机根据服务器配置选择的。
  • 堆的内存空间使用信息,包括分代情况,每个代的总容量、已使用内存、可使用内存。如果某一代被继续细分(例如,年轻代),则包含细分的空间的内存使用信息。

比如:

Java JVM内存分析工具 jmap_运维_03

C:\Users\Administrator>jmap -heap 1760
Attaching to process ID 1760, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.80-b11

using thread-local object allocation.                #新生代采用的是并行线程处理方式
Parallel GC with 4 thread(s)                            #同步并行垃圾回收

Heap Configuration:                                        #堆配置情况,也就是JVM参数配置的结果【平常说的tomcat配置JVM参数,就是在配置这些】
   MinHeapFreeRatio = 0                                #最小堆使用比例
   MaxHeapFreeRatio = 100                            #最大堆可用比例
   MaxHeapSize      = 2147483648 (2048.0MB)            #最大堆空间大小
   NewSize          = 1310720 (1.25MB)                #新生代分配大小
   MaxNewSize       = 536870912 (512.0MB)            #最大可新生代分配大小
   OldSize          = 5439488 (5.1875MB)            #老年代大小
   NewRatio         = 2                                #新生代比例
   SurvivorRatio    = 8                                #新生代与suvivor的比例
   PermSize         = 21757952 (20.75MB)            #perm区 永久代大小
   MaxPermSize      = 2147483648 (2048.0MB)            #最大可分配perm区 也就是永久代大小
   G1HeapRegionSize = 0 (0.0MB)                        

Heap Usage:                                            #堆使用情况【堆内存实际的使用情况】
PS Young Generation
Eden Space:                                                              #伊甸区
   capacity = 413663232 (394.5MB)                           #伊甸区容量
   used     = 41933104 (39.99052429199219MB)      #伊甸区已经使用大小
   free     = 371730128 (354.5094757080078MB)      #剩余容量
   10.137015029655814% used                                 #伊甸区使用情况
From Space:                                                        #survior1区
   capacity = 58195968 (55.5MB)                          #survior1区容量
   used     = 0 (0.0MB)                                           #surviror1区已使用情况
   free     = 58195968 (55.5MB)                             #surviror1区剩余容量
   0.0% used                                                          #survior1区使用比例
To Space:                                            #survior2区
   capacity = 56623104 (54.0MB)        #survior2区容量
   used     = 0 (0.0MB)                         #survior2区已使用情况
   free     = 56623104 (54.0MB)           #survior2区剩余容量
   0.0% used                                        #survior2区使用比例
PS Old Generation                                                        #老年代使用情况
   capacity = 458227712 (437.0MB)                              #老年代容量
   used     = 243170504 (231.90546417236328MB)     #老年代已使用容量
   free     = 215057208 (205.09453582763672MB)       #老年代剩余容量
   53.0676119387559% used                                        #老年代使用比例
PS Perm Generation                                              #永久代使用情况
   capacity = 176685056 (168.5MB)                       #perm区容量
   used     = 92300856 (88.02495574951172MB)   #perm区已使用容量
   free     = 84384200 (80.47504425048828MB)    #perm区剩余容量
   52.240329821668674% used                             #perm区使用比例

62625 interned Strings occupying 7287440 bytes.

-histo[:live]

显示Java堆中对象的统计信息,包括:对象数量、占用内存大小(单位:字节)和类的完全限定名。比如:

Java JVM内存分析工具 jmap_sed_04

要获得某个对象的大小,可以将其总大小除以该对象类型的数量。如果指定了live参数,则只计算活动的对象。比如:

Java JVM内存分析工具 jmap_老年代_05

-clstats

显示Java堆中元空间的类加载器的统计信息,包括:

class_loader:当Java虚拟机运行时,类加载器对象的地址 classes:已加载类的数量 bytes:该类加载器加载的所有类的元数据所占的字节数 parent_loader:父类加载器对象的地址,如果没有显示null。 alive:是否存活的标识,表示类加载器对象是否将被垃圾回收。 type:该类加载器的类名。

比如:

Java JVM内存分析工具 jmap_sed_06

-finalizerinfo

显示在F-Queue中等待Finalizer线程执行finalize方法的对象。比如:

Java JVM内存分析工具 jmap_老年代_07

-dump:[live,]format=b,file=

生成Java虚拟机的堆转储快照dump文件。具体说明如下:

  • live参数是可选的,如果指定,则只转储堆中的活动对象;如果没有指定,则转储堆中的所有对象。
  • format=b表示以hprof二进制格式转储Java堆的内存。
  • file=<filename>用于指定快照dump文件的文件名。

比如:

Java JVM内存分析工具 jmap_Java_08

-F

强制模式。如果指定的pid没有响应,可以配合-dump-histo一起使用。此模式下,不支持live参数。比如:

Java JVM内存分析工具 jmap_jvm_09

-h 和 -help

显示jinfo命令的帮助信息。