java工具之jmap工具

2019/07/03 java语言

java 之 jmap

​ jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

1、jmap的用法

可以使用jmap --help命令查看jmap的具体用法。

参数列表:

1. option: 选项参数。
2.  pid: 需要打印配置信息的进程ID。
3.  executable: 产生核心dump的Java可执行文件。
4.  core: 需要打印配置信息的核心文件。
5.  server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
6.  remote server IP or hostname 远程调试服务器的IP地址或主机名。

options:

1. no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
2.  heap: 显示Java堆详细信息
3.  histo[:live]:显示堆中对象的统计信息
4.  clstats:打印类加载器信息
5.  finalizerinfo:显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
6.  dump:<dump-options>:生成堆转储快照
7.  F:当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
8.  help:打印帮助信息
9.  J<flag>:指定传递给运行jmap的JVM的参数

2、实际测试

2.1、jmap pid

查看进程的内存映像信息,会打印目标中加载的每个对象的其实地址,映射大小和共享对象文件的路径全程。

jmap 7176
Attaching to process ID 7176, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
0x0000000062cd0000      144K    E:\program files\Java\jdk1.8\jre\bin\sunec.dll
0x0000000062d00000      68K     E:\program files\Java\jdk1.8\jre\bin\nio.dll
0x0000000062d20000      104K    E:\program files\Java\jdk1.8\jre\bin\net.dll
0x0000000062e20000      52K     E:\program files\Java\jdk1.8\jre\bin\management.dll
0x0000000062e30000      140K    E:\program files\Java\jdk1.8\jre\bin\instrument.dll
0x0000000062e60000      88K     E:\program files\Java\jdk1.8\jre\bin\zip.dll
0x0000000062e80000      8840K   E:\program files\Java\jdk1.8\jre\bin\server\jvm.dll
0x0000000063730000      840K    E:\program files\Java\jdk1.8\jre\bin\msvcr100.dll
0x0000000066670000      164K    E:\program files\Java\jdk1.8\jre\bin\java.dll
0x00000000666a0000      60K     E:\program files\Java\jdk1.8\jre\bin\verify.dll
0x00007ff6e81f0000      220K    E:\program files\Java\jdk1.8\bin\java.exe
0x00007ffb555b0000      84K     C:\Windows\system32\wshbth.dll
0x00007ffb555d0000      56K     C:\Windows\System32\winrnr.dll
....

2.2、jmap -heap pid

​ 描述的java堆的详细信息,打印出来一个堆的信息,包括使用的GC算法,堆的配置信息和各个内存区域内存的使用情况。

jmap -heap 7176
Attaching to process ID 7176, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13

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

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2126512128 (2028.0MB)
   NewSize                  = 44564480 (42.5MB)
   MaxNewSize               = 708837376 (676.0MB)
   OldSize                  = 89653248 (85.5MB)
   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 = 202899456 (193.5MB)
   used     = 136544264 (130.21875762939453MB)
   free     = 66355192 (63.28124237060547MB)
   67.29651557074652% used
From Space:
   capacity = 13107200 (12.5MB)
   used     = 10945880 (10.438804626464844MB)
   free     = 2161320 (2.0611953735351562MB)
   83.51043701171875% used
To Space:
   capacity = 13631488 (13.0MB)
   used     = 0 (0.0MB)
   free     = 13631488 (13.0MB)
   0.0% used
PS Old Generation
   capacity = 80216064 (76.5MB)
   used     = 16148768 (15.400665283203125MB)
   free     = 64067296 (61.099334716796875MB)
   20.13158860549428% used

22086 interned Strings occupying 2226680 bytes.

2.3、jmap -histo:live pid

显示堆中对象的统计信息,会包括每一个java类,对象的数量,内存使用大小,类名称,如果是live 则是只计算活动的对象。

jmap -histo:live 7176

 num     #instances         #bytes  class name
----------------------------------------------
   1:         60998        5874368  [C
   2:         17062        1501456  java.lang.reflect.Method
   3:         60470        1451280  java.lang.String
   4:         32932        1053824  java.util.concurrent.ConcurrentHashMap$Node
   5:          9450        1046824  java.lang.Class
   6:          5209         694704  [B
   7:         15962         638480  java.util.LinkedHashMap$Entry
   8:         10791         576208  [Ljava.lang.Object;
   9:          7123         544528  [Ljava.util.HashMap$Node;
  10:          7750         434000  java.util.LinkedHashMap
  11:         12088         386816  java.util.HashMap$Node
  12:         17498         386232  [Ljava.lang.Class;
  13:          4475         309792  [I
  ...

2.4、jmap -clstats pid

​ 打印类的加载器信息。具体会打印出java堆内存的永久保存区域的类加载器的智能统计信息,包括名称,活跃度,地址,父类加载器,加载的类的数量和大小都会被打印。

jmap -clstats 7176
Attaching to process ID 7176, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness.liveness analysis may be inaccurate ...
class_loader    classes bytes   parent_loader   alive?  type

<bootstrap>     2717    4725508   null          live    <internal>
0x0000000082715770      1       1473      null          dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000825b9658      1       1471      null          dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000081648c60      1       1471      null          dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000081649f60      1       1471      null          dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000081952a90      1       1472    0x00000000814688c8      dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000081955b90      1       880     0x00000000814688c8      dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x000000008195e090      1       880     0x00000000814688c8      dead    sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000082715e78      1       880     0x00000000814688c8      dead    sun/reflect/DelegatingClassLoader@0x000000010000a028

2.5、jmap -finalizerinfo pid

打印等待终结的对象信息。

jmap -finalizerinfo 7176
Attaching to process ID 7176, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
Number of objects pending for finalization: 0

2.6、jmap -dump:format=b,file=heapdump.phrof pid

​ 生成堆转储快照dump文件.

​ 使用hprof二进制格式转储java堆到指定的filename的文件中,如果想要查看heap dump文件,可以使用jhat(java堆分析工具,eclipse也有)读取生成的文件。

注意:由于JVM会将整个heap的信息dump到一个文件中,过程会比较耗时,并且工具在执行过程中保证dump的信息是可靠地,会暂停应用,线上的系统要注意这个

jmap -dump:format=b,file=heapdump.phrof 7176
Dumping heap to C:\Users\Administrator.2A217VYDOCRZIDV\heapdump.phrof ...
Heap dump file created

Search

    欢迎添加我的个人微信号

    个人微信哦

    Table of Contents