文章目录
一、作用
命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
二、语法
jmap [option]
说明:
option:命令选项
1. -heap
-
作用:打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;
-
示例:
如下命令:jmap -heap 5352Attaching to process ID 6800, please wait... Debugger attached successfully. Client compiler detected. JVM version is 25.131-b11 using thread-local object allocation. Mark Sweep Compact GC Heap Configuration:#堆内存初始化配置 MinHeapFreeRatio = 40 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率 MaxHeapFreeRatio = 70 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率 MaxHeapSize = 268435456 (256.0MB) #-XX:MaxHeapSize=设置JVM堆的最大大小 NewSize = 5570560 (5.3125MB)#-XX:NewSize=设置JVM堆的‘新生代’的默认大小 MaxNewSize = 89456640 (85.3125MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小 OldSize = 11206656 (10.6875MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小 NewRatio = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率 SurvivorRatio = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 MetaspaceSize = 12582912 (12.0MB) metaspace,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm(永久代) CompressedClassSpaceSize = 1073741824 (1024.0MB)#-XX:CompressedClassSpaceSize=设置Klass Metaspace的大小, MaxMetaspaceSize = 4294901760 (4095.9375MB)#用于设置metaspace区域的最大值,这个值可以通过mxbean中的MemoryPoolBean获取到,如果这个参数没有设置,那么就是通过mxbean拿到的最大值是-1,表示无穷大。 G1HeapRegionSize = 0 (0.0MB)#-XX:G1HeapRegionSize=n 使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb. Heap Usage: New Generation (Eden + 1 Survivor Space):#新生代区内存分布,包含伊甸园区+1个Survivor区 capacity = 5046272 (4.8125MB) used = 1044400 (0.9960174560546875MB) free = 4001872 (3.8164825439453125MB) 20.696466619318183% used Eden Space:#Eden区内存分布 capacity = 4521984 (4.3125MB) used = 1044400 (0.9960174560546875MB) free = 3477584 (3.3164825439453125MB) 23.096056951992754% used From Space:#其中一个Survivor区的内存分布 capacity = 524288 (0.5MB) used = 0 (0.0MB) free = 524288 (0.5MB) 0.0% used To Space: #另一个Survivor区的内存分布 capacity = 524288 (0.5MB) used = 0 (0.0MB) free = 524288 (0.5MB) 0.0% used tenured generation:#当前的Old区内存分布 capacity = 11206656 (10.6875MB) used = 0 (0.0MB) free = 11206656 (10.6875MB) 0.0% used 1621 interned Strings occupying 129144 bytes.
2. -histo[:live]
- 作用打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只统计活着的对象
- 示例:
如下命令:
jmap -histo 5352num #instances #bytes class name ---------------------------------------------- 1: 36358 5287912 [C 2: 6243 4726040 [B 3: 18352 2429632 <constMethodKlass> 4: 18352 1324168 <methodKlass> 5: 7171 1145512 [I 6: 1710 1071728 <constantPoolKlass> 7: 32460 779040 java.lang.String 8: 1710 680240 <instanceKlassKlass> 9: 1485 614736 <constantPoolCacheKlass> 10: 22541 540984 java.util.HashMap$Entry 11: 5060 404800 java.lang.reflect.Method 12: 5982 321680 [Ljava.lang.Object; ......
class name列出现了[C、[B、[L等很奇怪的内容,这些属于非自定义类,具体为:
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 |
3. -permstat
- 作用:(1.8以后改为 -clstats) 打印永久代统计信息
4. -finalizerinfo
- 作用:打印等待回收的对象信息
- 示例:
如下命令:
jmap -finalizerinfo 5352
Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象。Attaching to process ID 5352, please wait... Debugger attached successfully. Client compiler detected. JVM version is 24.60-b09 Number of objects pending for finalization: 0
5. -dump:<dump-options>
-
作用:以hprof二进制格式将Java堆信息输出到文件内,该文件可以用MAT、VisualVM或jhat等工具查看;
-
dump-options选项:
- live 只输出活着的对象;不指定,则输出堆中所有对象
- format=b 指定输出格式为二进制
- file= 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=G:\heap.bin