JVM工具学习(jmap工具使用)

jmap是jdk自带的JVM管理工具,可以查看堆内存使用情况、类加载器使用情况,以及导出dump文件等。

注明:实验虚拟机为 HotSpot™ 64-Bit ,jdk 版本为:1.8.0_162
使用方法
首先获取获取想要查看应用的 pid
pid 表示正在运行的java应用的pid。
jps (windows 和 linux系统中都适用)

JVM工具学习(jmap工具使用)
我们可用通过 jmap -h 查看jmap的使用帮助

jmap -heap pid 打印堆信息, 包括 JVM版本、垃圾收集器、堆配置、堆各个区域使用情况

C:\Users\lenovo>jmap -heap 21372
Attaching to process ID 21372, please wait…
Debugger attached successfully.
Server compiler detected.
JVM version is 25.162-b12

using thread-local object allocation. --使用对象分配
Parallel GC with 4 thread(s) --采用 Parallel 垃圾收集器

Heap Configuration: --堆内存初始化配置
MinHeapFreeRatio = 0 --对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 0)
MaxHeapFreeRatio = 100 --对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 100)
MaxHeapSize = 4253024256 (4056.0MB) --对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 88604672 (84.5MB) – 对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 1417674752 (1352.0MB) – 对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 177733632 (169.5MB) --对应jvm启动参数-XX:OldSize=:设置JVM堆的‘老年代’的大小
NewRatio = 2 --对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老年代’的大小比率
SurvivorRatio = 8 --对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值(比例为:8:1:1)
MetaspaceSize = 21807104 (20.796875MB) --对应jvm启动参数 -XX:MetaspaceSize= 设置元空间的默认初始值大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) --对应jvm启动参数-XX:CompressedClassSpaceSize= 设置类指针压缩空间大小, 默认为1G
MaxMetaspaceSize = 17592186044415 MB --对应jvm启动参数-XX:MaxMetaspaceSize=设置metaspace区域的最大值
G1HeapRegionSize = 0 (0.0MB) --对应jvm启动参数-XX:G1HeapRegionSize=,G1垃圾收集器堆内存分区Region初始大小

Heap Usage: --堆内存使用分布
PS Young Generation – 年轻代
Eden Space: --Eden分区空间
capacity = 66584576 (63.5MB) – Eden区总容量
used = 8011544 (7.640403747558594MB) --Eden区当前已经使用了的容量
free = 58573032 (55.859596252441406MB) --Eden区当前剩余的容量
12.032131885919044% used – Eden区使用比率
From Space: – 年轻代From Survivor区的内存分布
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space: – 年轻代TO Survivor区的内存分布
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
PS Old Generation --老年代分区
capacity = 177733632 (169.5MB) – 总容量大小
used = 0 (0.0MB) --当前已经使用大小
free = 177733632 (169.5MB) --剩余未使用大小
0.0% used --使用比例
3183 interned Strings occupying 260952 bytes. – 3183个内部字符串,占用260952字节

jmap -histo pid 打印堆内每个类的实例数,以及各自占用空间
JVM工具学习(jmap工具使用)
NUM:序号,instances :堆内实例的个数,bytes:堆内实例所占空间的大小,class name:实例对象类名

jmap -histo:live pid 打印堆内活动着的每个类的实例数,以及各自占用空间(显示结果,同上)
jmap -clstats pid 打印类加载器实例信息
JVM工具学习(jmap工具使用)
jmap -finalizerinfo pid 打印等待回收的对象信息:
JVM工具学习(jmap工具使用)
这里需要等待回收的对象信息为0;

jmap -dump pid 导出dump文件 例:jmap -dump:format=b,file=/home/user/8080.dump 17820

查看堆内某个类的实例存储情况
windows下 jmap -histo pid | findstr 类关键字,, jmap -histo 17820| findstr Persons
linux下 jmap -histo pid | grep 类关键字,, jmap -histo 17820| grep Persons

已上所述,综合自己的实际情况使用。
by – 蜗牛学JAVA(2020/4/4)