jmap的使用说明
文章目录
一、jamp的作用
二、语法及说明
三、 举例说明
一、jamp的作用
作用:监控内存内的Java对象
二、语法及说明
语法:
jmap [option] <pid>
说明:
option:命令选项,常用选项如下:
-heap: 打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;
-histo[:live]: 打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只 统计活着的对象 ;
-permstat 打印永久代统计信息;
-finalizerinfo 打印等待回收的对象信息
-dump:<dump-options> 以hprof二进制格式将Java堆信息输出到文件内,该文件可以用MAT、VisualVM或jhat等工具查看;
dump-options选项:
live 只输出活着的对象;不指定,则输出堆中所有对象
format=b 指定输出格式为二进制
file=<file> 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=D:\heap.bin <pid>
-F 与-dump:<dump-options> <pid>或-histo<pid>一起使用,当<pid>没有响应时,强制执行;注意:不支持live子选项
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...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11
using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40 //对应jvm启动参数-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堆的‘新生代’的默认大小
MaxNewSize = 643825664 (614.0MB)//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 4194304 (4.0MB)//对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio = 2//对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
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% used
G1 Young Generation://新生代的内存分布
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% used
G1 Old Generation://老年代的内存分布
regions = 74
capacity = 111149056 (106.0MB)
used = 75773360 (72.26310729980469MB)
free = 35375696 (33.73689270019531MB)
68.1727427356648% used
60745 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已经删除了永久代,取而代之的是新生代,因此无法无法得到永 久代的信息
那又如何得到元空间里面的信息呢?,如下图所示
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-b11
Number of objects pending for finalization: 0 //说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象
④-dump:<dump-options>,在cmd中执行如下命令,
输出结果如下: