jmap使用说明书的目录
一. jamp的作用
二.语法和说明
三.例示
一. jamp的作用
角色:监视内存中的Java对象
二.语法和说明
语法:
jmap [option] pid
说明:
选项:命令选项。 常见的选项包括:
-heap :打印Java堆摘要信息,包括使用的GC算法、堆配置参数和世代间的堆内存使用量;
– histo [ : live ] :打印Java堆中的对象直方图。 可以从这张图中获取每个class的对象数量、占用的内存大小和类名信息。 携带:live时,只计算活着的对象。
-permstat打印永久统计信息;
-finalizerinfo打印等待回收的对象信息
-dump:dump-options以hprof二进制格式将Java堆信息输出到文件。 可以使用MAT、VisualVM或jhat等工具查看此文件。
最佳选项:
演唱会只输出活着的对象; 如果不指定,则打印堆中的所有对象
format=b将输出格式指定为二进制
file=file指定文件名和文件的保存位置。 例如jmap -dump:live,format=b,file=D:\heap.bin pid
-F与-dump:dump-options pid或-histopid一起使用,如果pid没有响应,则强制执行; 注意:不支持实时子选项
pid :进程id
三.例示
有两种方法可以获取step1:进程的id,并在此处获取eclipse的pid。
方法1 )单击任务管理器——中的详细信息,显示eclipse进程的pid,如下图所示。
方法2 )单击Win R,键入cmd,在该页面中键入jps,还会获得Eclipse进程的pid,如下图所示
step2:然后输入表达式。
-heap、cmd执行以下命令,将输出的结果导入output.txt文件,便于分析,如下图所示。
输出结果:
Attaching to process ID 8124, please wait . debuggerattachedsuccessfully.clientcompilerdetected.jvmversionis 25.131-b 11 using thread-localobjectalloctatatallllocation
-XX:MinHeapFreeRatio设置JVM堆最小空闲比率defalut 40) MaxHeapFreeRatio = 70 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率default 70) MaxHeapSize = 1073741824 1024.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小 NewSize = 1048576 1.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘wxdwl代’的默认大小 MaxNewSize = 643825664 614.0MB)//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘wxdwl代’的最大大小 OldSize = 4194304 4.0MB)//对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小 NewRatio = 2//对应jvm启动参数-XX:NewRatio=:‘wxdwl代’和‘老生代’的大小比率 SurvivorRatio = 8//对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 //从这里可以看出JDK8开始,永久代已经被元空间所取代 MetaspaceSize = 12582912 12.0MB)对应jvm启动参数-XX:MetaspaceSize=<value>:设置JVM堆的‘元空间’的初始大小 CompressedClassSpaceSize = 1073741824 1024.0MB) MaxMetaspaceSize = 4294901760 4095.9375MB)//对应jvm启动参数-XX:MaxMetaspaceSize= :设置JVM堆的‘元空间’的最大大小 G1HeapRegionSize = 1048576 1.0MB)Heap Usage://堆内存分布 G1 Heap: regions = 1024 capacity = 1073741824 1024.0MB) used = 99890608 95.26310729980469MB) free = 973851216 928.7368927001953MB) 9.303037822246552% usedG1 Young Generation://wxdwl代的内存分布Eden Space://Eden区内存分布 regions = 9 capacity = 142606336 136.0MB) //Eden区总容量 used = 9437184 9.0MB) //Eden区已使用 free = 133169152 127.0MB) //Eden区剩余容量 6.617647058823529% used used //Eden区使用比率 Survivor Space: //其中一个Survivor区的内存分布 regions = 14 capacity = 14680064 14.0MB) used = 14680064 14.0MB) free = 0 0.0MB) 100.0% usedG1 Old Generation://老年代的内存分布 regions = 74 capacity = 111149056 106.0MB) used = 75773360 72.26310729980469MB) free = 35375696 33.73689270019531MB) 68.1727427356648% used60745 interned Strings occupying 5993360 bytes.
②-histo,在cmd中执行如下命令,将输出的结果导入到output.txt文件中,便于分析,如下图所示:
输出部分结果如下:
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
-permstat 打印永久代统计信息:如下图所示,由于使用jdk是1.8,jdk1.8已经删除了永久代,取而代之的是wxdwl代,因此无法无法得到永 久代的信息
那又如何得到元空间里面的信息呢?,如下图所示
jstat -gc <pid> :Metaspace的信息会被打印出来,如下面的例子所示:
③-finalizerinfo,在cmd中执行如下命令,将输出的结果导入到output.txt文件中,便于分析,如下图所示:
Attaching to process ID 8124, please wait…Debugger attached successfully.Client compiler detected.JVM version is 25.131-b11Number of objects pending for finalization: 0 //说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象
④-dump:<dump-options>,在cmd中执行如下命令,
输出结果如下: