jvm-command-jmap


jmap(Memory Map for Java)命令用来生成堆转储快照。

jmap的作用并不仅仅是为了生成堆转储快照文件,还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。

Java内存映像工具jmap

语法

jmap [ option ] vmid

option选项

选项 作用
-dump 生成java堆转储快照,格式为jmap -dump:[live,]format=b,file=
-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。
-heap 显示Java堆详细信息,如使用了那种回收器、参数配置、分代状况等。
-histo 显示堆中对象统计信息,包括类、实例数量、合计容器
-permstat 以ClassLoader为统计口径显示永久代内存状态
-F 当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照

使用

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

work@authority-web-v1-78f4d45f98-zpnx6:~$ jps
854586 Jps
47 authority-web.jar
work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap 47
Attaching to process ID 47, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.222-b10
0x0000000000400000      8K      /usr/local/openjdk-8/bin/java
0x00007fb7079e3000      82K     /lib/x86_64-linux-gnu/libresolv-2.24.so
0x00007fb707bfa000      22K     /lib/x86_64-linux-gnu/libnss_dns-2.24.so
0x00007fb74049a000      90K     /lib/x86_64-linux-gnu/libgcc_s.so.1
0x00007fb7406b1000      260K    /usr/local/openjdk-8/jre/lib/amd64/libsunec.so
0x00007fb76c7ca000      92K     /usr/local/openjdk-8/jre/lib/amd64/libnio.so
0x00007fb76c9dc000      51K     /usr/local/openjdk-8/jre/lib/amd64/libmanagement.so
0x00007fb76cbe6000      114K    /usr/local/openjdk-8/jre/lib/amd64/libnet.so
0x00007fb781dd5000      123K    /usr/local/openjdk-8/jre/lib/amd64/libzip.so
0x00007fb781ff1000      46K     /lib/x86_64-linux-gnu/libnss_files-2.24.so
0x00007fb782203000      46K     /lib/x86_64-linux-gnu/libnss_nis-2.24.so
0x00007fb78240f000      86K     /lib/x86_64-linux-gnu/libnsl-2.24.so
0x00007fb782627000      30K     /lib/x86_64-linux-gnu/libnss_compat-2.24.so
0x00007fb78282f000      50K     /usr/local/openjdk-8/jre/lib/amd64/libinstrument.so
0x00007fb782a3a000      202K    /usr/local/openjdk-8/jre/lib/amd64/libjava.so
0x00007fb782c64000      68K     /usr/local/openjdk-8/jre/lib/amd64/libverify.so
0x00007fb782e74000      31K     /lib/x86_64-linux-gnu/librt-2.24.so
0x00007fb78307c000      1038K   /lib/x86_64-linux-gnu/libm-2.24.so
0x00007fb783380000      15953K  /usr/local/openjdk-8/jre/lib/amd64/server/libjvm.so
0x00007fb7842e7000      1649K   /lib/x86_64-linux-gnu/libc-2.24.so
0x00007fb784686000      14K     /lib/x86_64-linux-gnu/libdl-2.24.so
0x00007fb78488a000      334K    /usr/local/openjdk-8/lib/amd64/jli/libjli.so
0x00007fb784aa1000      132K    /lib/x86_64-linux-gnu/libpthread-2.24.so
0x00007fb784cbe000      149K    /lib/x86_64-linux-gnu/ld-2.24.so
work@authority-web-v1-78f4d45f98-zpnx6:~$
work@authority-web-v1-78f4d45f98-zpnx6:~$

-heap显示Java堆的如下信息:

work@authority-web-v1-78f4d45f98-zpnx6:~$ ^C
work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap -heap 47
Attaching to process ID 47, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.222-b10

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 161480704 (154.0MB)
   NewSize                  = 53084160 (50.625MB)
   MaxNewSize               = 53084160 (50.625MB)
   OldSize                  = 108396544 (103.375MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 47775744 (45.5625MB)
   used     = 14542552 (13.868858337402344MB)
   free     = 33233192 (31.693641662597656MB)
   30.439195253557955% used
Eden Space:
   capacity = 42467328 (40.5MB)
   used     = 14496264 (13.824714660644531MB)
   free     = 27971064 (26.67528533935547MB)
   34.135097927517364% used
From Space:
   capacity = 5308416 (5.0625MB)
   used     = 46288 (0.0441436767578125MB)
   free     = 5262128 (5.0183563232421875MB)
   0.8719738618827161% used
To Space:
   capacity = 5308416 (5.0625MB)
   used     = 0 (0.0MB)
   free     = 5308416 (5.0625MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 108396544 (103.375MB)
   used     = 69763232 (66.53140258789062MB)
   free     = 38633312 (36.843597412109375MB)
   64.35927698949516% used

38279 interned Strings occupying 4296008 bytes.
work@authority-web-v1-78f4d45f98-zpnx6:~$

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


work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap -histo 47

 num     #instances         #bytes  class name
----------------------------------------------
   1:        203570       17317376  [C
   2:          8015        8330368  [I
   3:         11785        5102672  [B
   4:        200710        4817040  java.lang.String
   5:         54046        4756048  java.lang.reflect.Method
   6:         52052        3601488  [Ljava.util.Hashtable$Entry;
   7:         51912        2491776  java.util.Hashtable
   8:         69610        2227520  java.util.concurrent.ConcurrentHashMap$Node
   9:         42359        1694360  java.util.LinkedHashMap$Entry
  10:         14754        1648040  java.lang.Class
  11:         46595        1491040  java.util.Hashtable$Entry
  12:         24749        1364792  [Ljava.lang.Object;
  13:         16400        1307848  [Ljava.util.HashMap$Node;
  14:         51139        1227336  net.sourceforge.pinyin4j.multipinyin.Trie
  15:         35509        1136288  java.util.HashMap$Node
  16:         18233        1021048  java.util.LinkedHashMap
  17:         43037         938448  [Ljava.lang.Class;
  18:           652         728768  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  19:          9540         686880  java.lang.reflect.Field
  20:         18791         450984  java.util.ArrayList
work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap -histo:live 47

 num     #instances         #bytes  class name
----------------------------------------------
   1:        187827       15633816  [C
   2:        186246        4469904  java.lang.String
   3:         51818        3547824  [Ljava.util.Hashtable$Entry;
   4:         37131        3267528  java.lang.reflect.Method
   5:         51730        2483040  java.util.Hashtable
   6:         68132        2180224  java.util.concurrent.ConcurrentHashMap$Node
   7:          7198        1953120  [B
   8:         14565        1628384  java.lang.Class
   9:         38624        1544960  java.util.LinkedHashMap$Entry
  10:         41707        1334624  java.util.Hashtable$Entry
  11:          6902        1276800  [I
  12:         21838        1237912  [Ljava.lang.Object;
  13:         51139        1227336  net.sourceforge.pinyin4j.multipinyin.Trie
  14:         14954        1096368  [Ljava.util.HashMap$Node;
  15:         17222         964432  java.util.LinkedHashMap
  16:         25508         816256  java.util.HashMap$Node
  17:           558         704480  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  18:         22133         485168  [Ljava.lang.Class;
  19:         25426         406816  java.lang.Object
  20:         16800         403200  java.util.ArrayList

生成Java虚拟机的堆转储快照dump文件

  • live参数是可选的,如果指定,则只转储堆中的活动对象;如果没有指定,则转储堆中的所有对象。
  • format=b表示以hprof二进制格式转储Java堆的内存。
  • file=<filename>用于指定快照dump文件的文件名。
work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap -dump:live,format=b,file=/home/work/dump  47
Dumping heap to /home/work/dump ...
Heap dump file created
work@authority-web-v1-78f4d45f98-zpnx6:~$

-clstats 显示Java堆中元空间的类加载器的统计信息

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

引用

记录一次线上JVM调优


文章作者: WangQingLei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WangQingLei !
 上一篇
spring-boot-yml spring-boot-yml
SpringBoot读取properties(yml)文件中配置信息
2022-05-02
下一篇 
jvm-command-jstack jvm-command-jstack
jstack是JDK自带的线程堆栈分析工具,使用该命令可以查看或导出 java 应用程序中线程堆栈信息。 jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的
2022-04-05
  目录