In-depth understanding of java virtual machine --- virtual machine tool jmap (16)

Original: https://www.cnblogs.com/myna/p/7573843.html

jmap
The JVM Memory Map command is used to generate heap dump files. If you do not use this command, you can also use the -XX:+HeapDumpOnOutOfMemoryError parameter to automatically generate a dump file when the virtual machine has OOM. jmap can not only generate dump files, but also query the finalize execution queue, Java heap and permanent generation details, such as current usage, which collector is currently used, etc. 【Memory Analysis】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost jdk1.7.0_79] # jmap --help
Usage:
     jmap [option] <pid>
         (to connect to running process)
     jmap [option] <executable <core>
         (to connect to a core file )
     jmap [option] [server_id@]<remote server IP or hostname >
         (to connect to remote debug server)
 
where <option> is one of:
     <none>               to print same info as Solaris pmap
     -heap                to print java heap summary
     -histo[:live]        to print histogram of java object heap; if  the "live"
                          suboption is specified, only count live objects
     -permstat            to print permanent generation statistics
     -finalizerinfo       to print information on objects awaiting finalization
     -dump:<dump-options> to dump java heap in  hprof binary format
                          dump-options:
                            live         dump only live objects; if  not specified,
                                         all objects in  the heap are dumped.
                            format =b     binary format
                            file =< file >  dump heap to < file >
                          Example: jmap -dump:live, format =b, file =heap.bin <pid>
     -F                   force. Use with -dump:<dump-options> <pid> or -histo
                          to force a heap dump or histogram when <pid> does not
                          respond. The "live"  suboption is not supported
                          in  this mode.
     -h | -help           to print this help message
     -J<flag>             to pass <flag> directly to the runtime system

command format

1
2
3
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server- id @]remote- hostname -or-IP
 

parameter

option: option parameter, multiple option parameters cannot be used at the same time

pid: java process id, obtained by command ps -ef | grep java

executable: The java executable that produces the core dump

core: The core file that needs to print configuration information

remote-hostname-or-ip: hostname or ip for remote debugging

server-id: optional unique id, if multiple debug servers are running on the same remote host, use this option parameter to identify the server

 

options parameter

heap : show Java heap details
histo : show statistics of objects in the heap
permstat : Statistics of the class loader for the permanent holding area of ​​Java heap memory
finalizerinfo : display objects in the F-Queue queue waiting for the Finalizer thread to execute the finalizer method
dump : generate a heap dump snapshot
F : force a dump snapshot when -dump does not respond

 

Example

 

-dump

dump heap to file, format specifies the output format, live specifies a live object, and file specifies the file name

1
2
3
[root@localhost jdk1.7.0_79] # jmap -dump:live,format=b,file=dump.hprof 24971
Dumping heap to /usr/local/java/jdk1 .7.0_79 /dump .hprof ...
Heap dump file  created

-heap

Print the general information of the heap, the algorithm used by GC, the configuration and usage of the heap, which can be used to judge the current usage of memory and garbage collection.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@localhost jdk1.7.0_79] # jmap -heap 24971
Attaching to process ID 24971, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
 
using thread- local  object allocation.
Parallel GC with 4 thread(s)
 
Heap Configuration:
    MinHeapFreeRatio = 0
    MaxHeapFreeRatio = 100
    MaxHeapSize      = 4146069504 (3954.0MB)
    NewSize          = 1310720 (1.25MB)
    MaxNewSize       = 17592186044415 MB
    OldSize          = 5439488 (5.1875MB)
    NewRatio         = 2
    SurvivorRatio    = 8
    PermSize         = 21757952 (20.75MB)
    MaxPermSize      = 85983232 (82.0MB)
    G1HeapRegionSize = 0 (0.0MB)
 
Heap Usage:
PS Young Generation
Eden Space:
    capacity = 517996544 (494.0MB)
    used     = 151567520 (144.54605102539062MB)
    free      = 366429024 (349.4539489746094MB)
    29.26033421566612% used
From Space:
    capacity = 41943040 (40.0MB)
    used     = 0 (0.0MB)
    free      = 41943040 (40.0MB)
    0.0% used
To Space:
    capacity = 40370176 (38.5MB)
    used     = 0 (0.0MB)
    free      = 40370176 (38.5MB)
    0.0% used
PS Old Generation
    capacity = 115343360 (110.0MB)
    used     = 32927184 (31.401809692382812MB)
    free      = 82416176 (78.59819030761719MB)
    28.54709972034801% used
PS Perm Generation
    capacity = 85983232 (82.0MB)
    used     = 54701200 (52.16712951660156MB)
    free      = 31282032 (29.832870483398438MB)
    63.6184506300019% used
 
20822 interned Strings occupying 2441752 bytes.

-finalizerinfo

打印等待回收的对象信息,

 

1
2
3
4
5
6
[root@localhost jdk1.7.0_79] # jmap -finalizerinfo 24971
Attaching to process ID 24971, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
Number of objects pending for  finalization: 0

Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行final

izer方法的对象。

 

-histo

打印堆的对象统计,包括对象数、内存大小等等。jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost jdk1.7.0_79] # jmap -histo:live 24971 | more
 
  num     #instances         #bytes  class name
----------------------------------------------
    1:        100134       14622728  <constMethodKlass>
    2:        100134       12830128  <methodKlass>
    3:         88438       12708392  [C
    4:          8271       10163584  <constantPoolKlass>
    5:         27806        9115784  [B
    6:          8271        6225312  <instanceKlassKlass>
    7:          6830        5632192  <constantPoolCacheKlass>
    8:         86717        2081208  java.lang.String
    9:          2264        1311720  <methodDataKlass>
   10:         10880         870400  java.lang.reflect.Method
   11:          8987         869888  java.lang.Class
   12:         13330         747264  [[I
   13:         11808         733872  [S
   14:         20110         643520  java.util.concurrent.ConcurrentHashMap$HashEntry
   15:         18574         594368  java.util.HashMap$Entry
   16:          3668         504592  [Ljava.util.HashMap$Entry;
   17:         30698         491168  java.lang.Integer
   18:          2247         486864  [I
   19:          7486         479104  java.net.URL
   20:          8032         453616  [Ljava.lang.Object;
   21:         10259         410360  java.util.LinkedHashMap$Entry
   22:           699         380256  <objArrayKlassKlass>
   23:          5782         277536  org.apache.catalina.loader.ResourceEntry
   24:          8327         266464  java.lang.ref.WeakReference
   25:          2374         207928  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
   26:          3440         192640  java.util.LinkedHashMap
   27:          4779         191160  java.lang.ref.SoftReference
   28:          3576         171648  java.util.HashMap
   29:         10080         161280  java.lang.Object

jmap -histo:live 24971 | grep com.yuhuo 查询类名包含com.yuhuo的信息

jmap -histo:live 24971 | grep com.yuhuo > histo.txt 保存信息到histo.txt文件

附 - jmap输出中class name非自定义类的说明:

BaseType Character Type Interpretation
B byte signed byte
C char Unicode character
D double double-precision floating-point value
F float single-precision floating-point value
I int integer
J long long integer
L; reference an instance of class
S short signed short
Z boolean true or false
[ reference one array dimension,[I表示int[]

-permstat

打印Java堆内存的永久区的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost jdk1.7.0_79] # jmap -permstat 24971
Attaching to process ID 24971, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
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>   3034    18149440      null      live    <internal>
0x000000070a88fbb8  1   3048      null      dead    sun /reflect/DelegatingClassLoader @0x0000000703c50b58
0x000000070a914860  1   3064    0x0000000709035198  dead    sun /reflect/DelegatingClassLoader @0x0000000703c50b58
0x000000070a9fc320  1   3056    0x0000000709035198  dead    sun /reflect/DelegatingClassLoader @0x0000000703c50b58
0x000000070adcb4c8  1   3064    0x0000000709035198  dead    sun /reflect/DelegatingClassLoader @0x0000000703c50b58
0x000000070a913760  1   1888    0x0000000709035198  dead    sun /reflect/DelegatingClassLoader @0x0000000703c50b58
0x0000000709f3fd40  1   3032      null      dead    sun /reflect/DelegatingClassLoader @0x0000000703c50b58
0x000000070923ba78  1   3088    0x0000000709035260  dead    sun /reflect/DelegatingClassLoader @0x0000000703c50b58
0x000000070a88fff8  1   3048      null      dead    sun /reflect/DelegatingClassLoader @0x0000000703c50b58
0x000000070adcbc58  1   1888    0x0000000709035198  dead    sun /reflect/DelegatingClassLoader @0x0000000703c50b58

-F

强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325397056&siteId=291194637