The jmap
command-line utility prints memory-related statistics for a running VM or core file.
The utility can also use the jsadebugd
daemon to query a process or core file on a remote machine. Note: The output takes longer to print in this case.
The release of JDK 8 introduced Java Mission Control, Java Flight Recorder, and jcmd
utility for diagnosing problems with JVM and Java applications. It is suggested to use the latest utility, jcmd
instead of the previous jmap
utility for enhanced diagnostics and reduced performance overhead.
If jmap
is used with a process or core file without any command-line options, then it prints the list of shared objects loaded (the output is similar to the pmap
utility on Oracle Solaris operating system). For more specific information, you can use the options -heap
, -histo
, or -permstat
. These options are described in the subsections that follow.
In addition, the JDK 7 release introduced the -dump:format=b,file=
filename option, which causes jmap
to dump the Java heap in binary HPROF format to a specified file. This file can then be analyzed with the jhat
tool.
If the jmap
pid command does not respond because of a hung process, then the -F
option can be used (on Oracle Solaris and Linux operating systems only) to force the use of the Serviceability Agent.
For more details on the jmap
utility, see the jmap
command man page.
The following sections describe jmap
command usage and troubleshooting techniques with examples that print memory-related statistics for a running VM or a core file.
The -heap
option is used to obtain the following Java heap information:
Information specific to the garbage collection (GC) algorithm, including the name of the GC algorithm (for example, parallel GC) and algorithm-specific details (such as number of threads for parallel GC).
Heap configuration that might have been specified as command-line options or selected by the VM based on the machine configuration.
Heap usage summary: For each generation (area of the heap), the tool prints the total heap capacity, in-use memory, and available free memory. If a generation is organized as a collection of spaces (for example, the new generation), then a space specific memory size summary is included.
Example 2-22 shows output from the jmap -heap
command.
Example 2-22 Java Heap Information from jmap -heap Command
$ jmap -heap 29620
Attaching to process ID 29620, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.6.0-rc-b100
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 67108864 (64.0MB)
NewSize = 2228224 (2.125MB)
MaxNewSize = 4294901760 (4095.9375MB)
OldSize = 4194304 (4.0MB)
NewRatio = 8
SurvivorRatio = 8
PermSize = 12582912 (12.0MB)
MaxPermSize = 67108864 (64.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 2031616 (1.9375MB)
used = 70984 (0.06769561767578125MB)
free = 1960632 (1.8698043823242188MB)
3.4939673639112905% used
Eden Space:
capacity = 1835008 (1.75MB)
used = 36152 (0.03447723388671875MB)
free = 1798856 (1.7155227661132812MB)
1.9701276506696428% used
From Space:
capacity = 196608 (0.1875MB)
used = 34832 (0.0332183837890625MB)
free = 161776 (0.1542816162109375MB)
17.716471354166668% used
To Space:
capacity = 196608 (0.1875MB)
used = 0 (0.0MB)
free = 196608 (0.1875MB)
0.0% used
tenured generation:
capacity = 15966208 (15.2265625MB)
used = 9577760 (9.134063720703125MB)
free = 6388448 (6.092498779296875MB)
59.98769400974859% used
Perm Generation:
capacity = 12582912 (12.0MB)
used = 1469408 (1.401336669921875MB)
free = 11113504 (10.598663330078125MB)
11.677805582682291% used
The jmap
command with the -histo
option can be used to obtain a class specific histogram of the heap. Depending on the parameter specified, the jmap -histo
command can print out the heap histogram for a running process or a core file.
When the command is executed on a running process, the tool prints the number of objects, memory size in bytes, and fully qualified class name for each class. Internal classes in the Java HotSpot VM are enclosed in angle brackets. The histogram is useful in understanding how the heap is used. To get the size of an object, you must divide the total size by the count of that object type.
Example 2-23 shows output from the jmap -histo
command when it is executed on a process with PID number 29620.
Example 2-23 Class Specific Histogram of Java Heap for a Process
$ jmap -histo 29620
num #instances #bytes class name
--------------------------------------
1: 1414 6013016 [I
2: 793 482888 [B
3: 2502 334928 <constMethodKlass>
4: 280 274976 <instanceKlassKlass>
5: 324 227152 [D
6: 2502 200896 <methodKlass>
7: 2094 187496 [C
8: 280 172248 <constantPoolKlass>
9: 3767 139000 [Ljava.lang.Object;
10: 260 122416 <constantPoolCacheKlass>
11: 3304 112864 <symbolKlass>
12: 160 72960 java2d.Tools$3
13: 192 61440 <objArrayKlassKlass>
14: 219 55640 [F
15: 2114 50736 java.lang.String
16: 2079 49896 java.util.HashMap$Entry
17: 528 48344 [S
18: 1940 46560 java.util.Hashtable$Entry
19: 481 46176 java.lang.Class
20: 92 43424 javax.swing.plaf.metal.MetalScrollButton
... more lines removed here to reduce output...
1118: 1 8 java.util.Hashtable$EmptyIterator
1119: 1 8 sun.java2d.pipe.SolidTextRenderer
Total 61297 10152040
When the jmap -histo
command is executed on a core file, the tool prints the size, count, and class name for each class. Internal classes in the Java HotSpot VM are prefixed with an asterisk (*).
Example 2-24 shows output of the jmap -histo
command when it is executed on a core file.
Example 2-24 Histogram of Java Heap for a Core File
$ jmap -histo /usr/bin/java core Attaching to core core from executable /usr/bin/java, please wait... Debugger attached successfully. Server compiler detected. JVM version is 1.6.0-rc-b100 Iterating over heap. This may take a while... Heap traversal took 8.902 seconds. Object Histogram: Size Count Class description ------------------------------------------------------- 4151816 2941 int[] 2997816 26403 * ConstMethodKlass 2118728 26403 * MethodKlass 1613184 39750 * SymbolKlass 1268896 2011 * ConstantPoolKlass 1097040 2011 * InstanceKlassKlass 882048 1906 * ConstantPoolCacheKlass 758424 7572 char[] 733776 2518 byte[] 252240 3260 short[] 214944 2239 java.lang.Class 177448 3341 * System ObjArray 176832 7368 java.lang.String 137792 3756 java.lang.Object[] 121744 74 long[] 72960 160 java2d.Tools$3 63680 199 * ObjArrayKlassKlass 53264 158 float[] ... more lines removed here to reduce output...
Use the jmap
command with the -clstats
option to print class loader statistics for the Java heap.
The jmap
command connects to a running process using the process ID and prints detailed information about classes loaded in the Metaspace:
The following example shows the output from the jmap -clstats
command when it is executed on a process with PID number 16624.
$ jmap -clstats 16624 Attaching to process ID 16624, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.211-b12 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> 982 1845411 null live <internal> 0x000000076f5081e0 1948 3133806 null dead sun/misc/Launcher$ExtClassLoader@0x00000007c000fc80 0x000000076e13d3d0 1 1481 null dead sun/reflect/DelegatingClassLoader@0x00000007c000a028 0x000000076ca9e100 0 0 0x000000076f510178 dead java/util/ResourceBundle$RBClassLoader@0x00000007c01ade48 0x000000076f510178 38 94160 0x000000076f5081e0 dead sun/misc/Launcher$AppClassLoader@0x00000007c000f8d8 total = 5 2969 5074858 N/A alive=1, dead=4 N/A