杭州p2p网站建设不允许网站建设协议
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子参数会无效。
