文章目录
一、jamp的作用
二、语法及说明
三、 举例说明
一、jamp的作用
作用:监控内存内的Java对象
二、语法及说明
语法:
jmap [option]
说明:
option:命令选项,常用选项如下:
-heap: 打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;
-histo[:live]: 打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只 统计活着的对象 ;
-permstat 打印永久代统计信息;
-finalizerinfo 打印等待回收的对象信息
-dump:
dump-options选项:
live 只输出活着的对象;不指定,则输出堆中所有对象
format=b 指定输出格式为二进制
file=
-F 与-dump:
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=:设置JVM堆的‘老生代’的大小
NewRatio = 2//对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8//对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
//从这里可以看出JDK8开始,永久代已经被元空间所取代
MetaspaceSize = 12582912 (12.0MB)对应jvm启动参数-XX:MetaspaceSize=:设置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
③-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:
输出结果如下: