1. jmap描述
jmap全称jvm memory map,该命令有两个作用:第一个是可以获取堆dump文件,dump文件是堆转储快照的二进制文件文件;第二还可以获取堆的使用情况、堆中对象统计信息以及类加载信息等。
2. jmap用法
2.1 导出dump文件
命令:jmap -dump:format=b, file=文件名 pid
或者 jmap -dump:live,format=b,file=文件名 pid
其中第一条命令表示导出堆中所有对象的dump文件,第二条命令表示只导出存活对象的dump文件。通常Heap dump文件时都会触发一次FULL GC,所以dump文件中都是保存的FULL GC后的对象信息。
E:\study\tool\javaSE1.8\jdk1.8\bin>jmap -dump:live,format=b,file=d:\dump 9712
Dumping heap to D:\dump ...
Heap dump file created
另外除上述方式外,还可以在JVM启动时设置参数,当发生OOM异常时自动生成dump文件,需设置的JVM参数为:-XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=文件名
2.2 输出堆内存信息
2.2.1 输出堆空间使用信息
命令:jmap -heap pid
输出堆空间的详细信息,包括GC的使用情况、堆配置信息以及内存的使用信息等。
E:\study\tool\javaSE1.8\jdk1.8\bin>jmap -heap 9712 > d:\test1
test1文件内容如下所示,列举出了堆空间配置信息以及使用情况。
Attaching to process ID 9712, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.31-b07
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 3187671040 (3040.0MB)
NewSize = 66060288 (63.0MB)
MaxNewSize = 1062207488 (1013.0MB)
OldSize = 133169152 (127.0MB)
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 = 50331648 (48.0MB)
used = 0 (0.0MB)
free = 50331648 (48.0MB)
0.0% used
From Space:
capacity = 7864320 (7.5MB)
used = 0 (0.0MB)
free = 7864320 (7.5MB)
0.0% used
To Space:
capacity = 7864320 (7.5MB)
used = 0 (0.0MB)
free = 7864320 (7.5MB)
0.0% used
PS Old Generation
capacity = 51904512 (49.5MB)
used = 1069128 (1.0195999145507812MB)
free = 50835384 (48.48040008544922MB)
2.0597978071732954% used
3089 interned Strings occupying 275096 bytes.
2.2.2 输出对象统计信息
命令:jmap -histo pid
出堆中对象的统计信息,包括类、实例数量和总计容量,而jmap -histo:live pid
表示存活对象的统计信息。
E:\study\tool\javaSE1.8\jdk1.8\bin>jmap -histo:live 9712 > d:\test2
test2文件中统计的对象统计信息如下所示
num #instances #bytes class name
----------------------------------------------
1: 4597 482296 [C
2: 421 129672 [B
3: 4228 101472 java.lang.String
4: 686 72784 java.lang.Class
5: 639 41784 [Ljava.lang.Object;
6: 785 31400 java.util.TreeMap$Entry
7: 183 20392 [I
8: 236 11784 [Ljava.lang.String;
9: 332 10624 java.util.HashMap$Node
10: 107 6848 java.net.URL
11: 108 4320 java.lang.ref.SoftReference
12: 20 4160 [Ljava.util.HashMap$Node;
13: 256 4096 java.lang.Integer
14: 118 3776 java.util.Hashtable$Entry
15: 110 3520 java.util.concurrent.ConcurrentHashMap$Node
16: 104 3512 [[C
17: 7 2632 java.lang.Thread
18: 52 2496 sun.misc.URLClassPath$JarLoader
19: 29 2320 [Ljava.util.WeakHashMap$Entry;
20: 58 2320 java.util.LinkedHashMap$Entry
21: 26 2080 java.lang.reflect.Constructor
22: 15 1968 [Ljava.util.concurrent.ConcurrentHashMap$Node;
23: 39 1872 sun.util.locale.LocaleObjectCache$CacheEntry
24: 45 1800 java.lang.ref.Finalizer
25: 26 1664 java.util.jar.JarFile
26: 17 1632 java.util.jar.JarFile$JarFileEntry
27: 28 1568 sun.nio.cs.UTF_8$Encoder
28: 1 1560 [[B
29: 58 1392 java.io.ExpiringCache$Entry
30: 29 1392 java.util.WeakHashMap
31: 84 1344 java.lang.Object
32: 28 1344 java.util.HashMap
33: 20 1280 java.util.concurrent.ConcurrentHashMap
34: 30 1200 java.io.ObjectStreamField
35: 9 1184 [Ljava.util.Hashtable$Entry;
36: 36 1152 java.lang.ref.ReferenceQueue
37: 1 1040 [Ljava.lang.Integer;
38: 26 832 java.util.zip.ZipCoder
39: 19 760 sun.util.locale.BaseLocale$Key
40: 26 624 java.util.ArrayDeque
41: 19 608 java.io.File
42: 38 608 java.lang.ref.ReferenceQueue$Lock
43: 19 608 java.util.Locale
44: 19 608 sun.util.locale.BaseLocale
45: 12 480 java.security.AccessControlContext
46: 10 480 java.util.zip.Inflater
47: 19 456 java.util.Locale$LocaleKey
48: 1 432 [[[C
49: 18 432 sun.misc.MetaIndex
50: 17 408 java.util.jar.Attributes$Name
51: 1 384 com.intellij.rt.execution.application.AppMainV2$1
52: 1 384 java.lang.ref.Finalizer$FinalizerThread
53: 6 384 java.nio.DirectByteBuffer
54: 1 376 java.lang.ref.Reference$ReferenceHandler
55: 13 360 [Ljava.io.ObjectStreamField;
56: 19 360 [Ljava.lang.Class;
57: 6 336 java.nio.DirectLongBufferU
58: 4 320 [S
59: 3 312 [D
60: 13 312 sun.reflect.NativeConstructorAccessorImpl
61: 9 288 java.lang.OutOfMemoryError
62: 5 280 sun.util.calendar.ZoneInfo
63: 11 264 java.util.ArrayList
64: 8 256 java.util.Vector
65: 3 240 [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;
66: 5 240 java.util.Hashtable
67: 10 240 java.util.zip.ZStreamRef
68: 2 216 [J
69: 13 208 sun.reflect.DelegatingConstructorAccessorImpl
70: 5 200 java.security.ProtectionDomain
71: 5 200 java.util.WeakHashMap$Entry
72: 6 192 java.lang.ThreadLocal$ThreadLocalMap$Entry
73: 4 192 java.util.Properties
74: 4 192 java.util.TreeMap
75: 3 168 java.util.ResourceBundle$CacheKey
76: 2 160 [[Ljava.lang.String;
77: 4 160 java.io.FileDescriptor
78: 4 160 java.lang.ClassLoader$NativeLibrary
79: 5 160 java.security.CodeSource
80: 5 160 sun.util.locale.provider.LocaleProviderAdapter$Type
81: 3 144 java.nio.HeapByteBuffer
82: 6 144 java.util.LinkedList$Node
83: 3 144 java.util.ResourceBundle$BundleReference
84: 6 144 sun.misc.PerfCounter
85: 2 128 java.io.ExpiringCache$1
86: 4 128 java.util.LinkedList
87: 4 128 java.util.Stack
88: 1 120 java.net.SocksSocketImpl
89: 5 120 java.util.Collections$UnmodifiableRandomAccessList
90: 5 120 sun.misc.FloatingDecimal$PreparedASCIIToBinaryBuffer
91: 3 120 sun.misc.URLClassPath
92: 2 112 java.lang.Package
93: 2 112 java.util.LinkedHashMap
94: 1 96 [Ljava.lang.invoke.MethodType;
95: 4 96 java.lang.RuntimePermission
96: 2 96 java.lang.ThreadGroup
97: 3 96 java.util.ResourceBundle$LoaderReference
98: 3 96 sun.net.spi.DefaultProxySelector$NonProxyInfo
99: 2 96 sun.nio.cs.StreamEncoder
100: 1 88 java.net.DualStackPlainSocketImpl
101: 1 88 sun.misc.Launcher$AppClassLoader
102: 1 88 sun.misc.Launcher$ExtClassLoader
103: 1 80 [Ljava.lang.invoke.LambdaForm;
104: 5 80 [Ljava.security.Principal;
105: 2 80 java.io.BufferedWriter
106: 2 80 java.io.ExpiringCache
107: 5 80 java.lang.ThreadLocal
108: 2 80 java.lang.invoke.MethodType
109: 5 80 java.security.ProtectionDomain$Key
110: 2 80 sun.misc.FloatingDecimal$BinaryToASCIIBuffer
111: 3 72 java.lang.ThreadLocal$ThreadLocalMap
112: 1 72 java.lang.invoke.MethodTypeForm
113: 3 72 java.net.Proxy$Type
114: 3 72 java.util.Arrays$ArrayList
115: 3 72 java.util.Collections$SynchronizedSet
116: 1 72 java.util.ResourceBundle$RBClassLoader
117: 3 72 sun.misc.FloatingDecimal$ExceptionalBinaryToASCIIBuffer
118: 1 72 sun.util.locale.provider.JRELocaleProviderAdapter
119: 1 64 [F
120: 2 64 [Ljava.lang.Thread;
121: 2 64 java.io.FileOutputStream
122: 2 64 java.io.FilePermission
123: 2 64 java.io.PrintStream
124: 2 64 java.lang.VirtualMachineError
125: 2 64 java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry
126: 2 64 java.lang.ref.ReferenceQueue$Null
127: 2 64 java.security.BasicPermissionCollection
128: 2 64 java.security.Permissions
129: 4 64 java.util.HashSet
130: 1 56 java.lang.invoke.MemberName
131: 2 48 java.io.BufferedOutputStream
132: 1 48 java.io.BufferedReader
133: 2 48 java.io.File$PathStatus
134: 2 48 java.io.FilePermissionCollection
135: 2 48 java.io.OutputStreamWriter
136: 2 48 java.net.InetAddress$Cache
137: 2 48 java.net.InetAddress$Cache$Type
138: 1 48 java.net.SocketInputStream
139: 1 48 java.nio.HeapCharBuffer
140: 2 48 java.nio.charset.CoderResult
141: 3 48 java.nio.charset.CodingErrorAction
142: 2 48 sun.misc.NativeSignalHandler
143: 2 48 sun.misc.Signal
144: 3 48 sun.net.www.protocol.jar.Handler
145: 1 48 sun.nio.cs.StreamDecoder
146: 1 48 sun.nio.cs.US_ASCII$Decoder
147: 1 48 sun.util.locale.provider.LocaleResources$ResourceReference
148: 1 40 [Lsun.util.locale.provider.LocaleProviderAdapter$Type;
149: 1 40 java.io.BufferedInputStream
150: 1 40 java.util.ResourceBundle$1
151: 1 40 sun.nio.cs.StandardCharsets$Aliases
152: 1 40 sun.nio.cs.StandardCharsets$Cache
153: 1 40 sun.nio.cs.StandardCharsets$Classes
154: 1 40 sun.nio.cs.UTF_8$Decoder
155: 1 40 sun.nio.cs.ext.ExtendedCharsets
156: 1 32 [Ljava.lang.OutOfMemoryError;
157: 2 32 [Ljava.lang.StackTraceElement;
158: 1 32 [Ljava.lang.ThreadGroup;
159: 1 32 [Ljava.net.Proxy$Type;
160: 1 32 java.io.FileInputStream
161: 1 32 java.io.WinNTFileSystem
162: 1 32 java.lang.ArithmeticException
163: 2 32 java.lang.Boolean
164: 1 32 java.lang.NullPointerException
165: 1 32 java.net.Socket
166: 2 32 java.nio.ByteOrder
167: 1 32 java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
168: 1 32 sun.instrument.InstrumentationImpl
169: 1 32 sun.nio.cs.StandardCharsets
170: 1 32 sun.util.locale.provider.LocaleResources
171: 1 32 sun.util.locale.provider.LocaleServiceProviderPool
172: 1 24 [Ljava.io.File$PathStatus;
173: 1 24 [Ljava.lang.invoke.MethodHandle;
174: 1 24 [Ljava.net.InetAddress$Cache$Type;
175: 1 24 [Ljava.security.ProtectionDomain;
176: 1 24 [Lsun.launcher.LauncherHelper;
177: 1 24 java.io.InputStreamReader
178: 1 24 java.lang.StringBuilder
179: 1 24 java.lang.invoke.LambdaForm$NamedFunction
180: 1 24 java.lang.invoke.MethodType$ConcurrentWeakInternSet
181: 1 24 java.lang.reflect.ReflectPermission
182: 1 24 java.net.Inet4Address
183: 1 24 java.net.Inet6AddressImpl
184: 1 24 java.net.InetAddress$InetAddressHolder
185: 1 24 java.net.Proxy
186: 1 24 java.util.BitSet
187: 1 24 java.util.Collections$EmptyMap
188: 1 24 java.util.Collections$SetFromMap
189: 1 24 java.util.Locale$Cache
190: 1 24 java.util.ResourceBundle$Control$CandidateListCache
191: 1 24 sun.instrument.TransformerManager
192: 1 24 sun.launcher.LauncherHelper
193: 1 24 sun.misc.JarIndex
194: 1 24 sun.misc.URLClassPath$FileLoader
195: 1 24 sun.nio.cs.ISO_8859_1
196: 1 24 sun.nio.cs.ThreadLocalCoders$1
197: 1 24 sun.nio.cs.ThreadLocalCoders$2
198: 1 24 sun.nio.cs.US_ASCII
199: 1 24 sun.nio.cs.UTF_16
200: 1 24 sun.nio.cs.UTF_16BE
201: 1 24 sun.nio.cs.UTF_16LE
202: 1 24 sun.nio.cs.UTF_8
203: 1 24 sun.nio.cs.ext.GBK
204: 1 24 sun.util.locale.BaseLocale$Cache
205: 1 24 sun.util.locale.provider.TimeZoneNameProviderImpl
206: 1 16 [Ljava.lang.Throwable;
207: 1 16 [Ljava.security.cert.Certificate;
208: 1 16 [Lsun.instrument.TransformerManager$TransformerInfo;
209: 1 16 java.io.FileDescriptor$1
210: 1 16 java.lang.CharacterData00
211: 1 16 java.lang.CharacterDataLatin1
212: 1 16 java.lang.Runtime
213: 1 16 java.lang.String$CaseInsensitiveComparator
214: 1 16 java.lang.System$2
215: 1 16 java.lang.Terminator$1
216: 1 16 java.lang.invoke.MemberName$Factory
217: 1 16 java.lang.ref.Reference$Lock
218: 1 16 java.lang.reflect.ReflectAccess
219: 1 16 java.net.InetAddress$2
220: 1 16 java.net.URLClassLoader$7
221: 1 16 java.nio.Bits$1
222: 1 16 java.nio.charset.CoderResult$1
223: 1 16 java.nio.charset.CoderResult$2
224: 1 16 java.security.ProtectionDomain$1
225: 1 16 java.security.ProtectionDomain$3
226: 1 16 java.util.Collections$EmptyList
227: 1 16 java.util.Collections$EmptySet
228: 1 16 java.util.Hashtable$EntrySet
229: 1 16 java.util.ResourceBundle$Control
230: 1 16 java.util.WeakHashMap$KeySet
231: 1 16 java.util.concurrent.atomic.AtomicInteger
232: 1 16 java.util.jar.JavaUtilJarAccessImpl
233: 1 16 java.util.zip.ZipFile$1
234: 1 16 sun.misc.ASCIICaseInsensitiveComparator
235: 1 16 sun.misc.FloatingDecimal$1
236: 1 16 sun.misc.Launcher
237: 1 16 sun.misc.Launcher$Factory
238: 1 16 sun.misc.Perf
239: 1 16 sun.misc.Unsafe
240: 1 16 sun.net.spi.DefaultProxySelector
241: 1 16 sun.net.www.protocol.file.Handler
242: 1 16 sun.reflect.ReflectionFactory
243: 1 16 sun.util.calendar.Gregorian
244: 1 16 sun.util.locale.provider.AuxLocaleProviderAdapter$NullProvider
245: 1 16 sun.util.locale.provider.SPILocaleProviderAdapter
246: 1 16 sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter
247: 1 16 sun.util.resources.LocaleData
248: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total 14255 990352
另外除了上述常用指令所示,还有不常用的如下命令:
jmap -finailizerinfo pid
输出在F-Queue中等待Finalizer线程执行finalize方法的对象,只在Linux/Solaris平台有效;jmap -permstat pid
以ClassLoader为统计口径显示永久代(JDK7之前版本)的内存状态,只在Linux/Solaris平台有效;jmap -dump -F pid
当dump文件没相应时,强制生成dump文件,只在Linux/Solaris平台有效。