java工具 jmap 命令的使用方法以及堆内存快照的创建及分析(1)
jmap是java虚拟机自带的一种内存映像工具,我们可以通过该工具配合不同的参数来查看java虚拟机内存的详细信息(如程序中出现的所有对象的数量以及占用内存大小等),以及通过虚拟机内存的使用情况来定位以及分析程序中出现的问题。下面将详介绍该命令的使用。
命令格式:
jmap [option] <pid>
(to connect to running process) 连接到正在运行的进程
jmap [option] <executable <core>
(to connect to a core file) 连接到核心文件
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server) 连接到远程调试服务
参数说明
-
pid: 目标进程的PID,进程编号,可以采用ps -ef | grep java 查看java进程的PID
- executable: 产生core dump的java可执行程序
- core: 将被打印信息的core dump文件
- remote-hostname-or-IP: 远程debug服务的主机名或ip
- server-id: 唯一id,假如一台主机上多个远程debug服务
基本参数[option]说明与案例
一、-heap 参数
该参数将会打印堆内存(heap)的概要信息,GC使用的算法,heap的配置,内存使用情况等信息。
jmap -heap 24984
说明:24984 是程序的pid
C:\Users\LENOVO>jmap -heap 24984
Attaching to process ID 24984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
using thread-local object allocation.
Parallel GC with 4 thread(s) //GC 方式
Heap Configuration: //堆内存初始化配置
MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 4267704320 (4070.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 89128960 (85.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 1422393344 (1356.5MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 179306496 (171.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
MetaspaceSize = 21807104 (20.796875MB) // 元空间进行fgc的阈值
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB //元空间的内存的实现就是本地内存,所以默认是本地内存的大小
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: //堆内存使用情况
PS Young Generation
Eden Space: //Eden区内存分布
capacity = 136839168 (130.5MB) //Eden区总容量
used = 89439976 (85.2966079711914MB) //Eden区已使用
free = 47399192 (45.203392028808594MB) //Eden区剩余容量
65.36138541853748% used //Eden区使用比率
From Space: //其中一个Survivor区的内存分布
capacity = 17825792 (17.0MB)
used = 15765912 (15.035545349121094MB)
free = 2059880 (1.9644546508789062MB)
88.44438440659466% used
To Space: //另一个Survivor区的内存分布
capacity = 19922944 (19.0MB)
used = 0 (0.0MB)
free = 19922944 (19.0MB)
0.0% used
PS Old Generation //当前的Old区内存分布
capacity = 184025088 (175.5MB)
used = 21898568 (20.88410186767578MB)
free = 162126520 (154.61589813232422MB)
11.899773143974803% used
26048 interned Strings occupying 3009800 bytes.
二、-histo[:live] 参数
该参数将会 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.。
jmap -histo:live 24984
C:\Users\LENOVO>jmap -histo:live 24984
num #instances(实例数) #bytes(字节大小) class name(类名) ----------------------------------------------
1: 90973 43448952 [B
2: 268286 32546840 [C
3: 30631 11078832 [I
4: 173127 4155048 java.lang.String
5: 48189 2620928 [Ljava.lang.Object;
6: 23291 2049608 java.lang.reflect.Method
7: 9985 1109960 java.lang.Class
8: 33297 1065504 java.util.concurrent.ConcurrentHashMap$Node
9: 12709 901240 [Ljava.util.HashMap$Node;
10: 27986 895552 java.util.HashMap$Node
11: 21350 854000 java.util.LinkedHashMap$Entry
12: 12383 693448 java.util.LinkedHashMap
13: 26190 628560 java.lang.StringBuilder
14: 25778 618672 java.util.ArrayList
...
..
.
三、-dump:[live],format=b,file=<filename> 参数
该参数将会 使用hprof二进制的形式输出jvm的heap内容到指定文件,live子选项是可选的,假如指定live选项,那么只输出活的对象到文件。
jmap -dump:live,format=b,file=a.hprof 24984
C:\Users\LENOVO>jmap -dump:live,format=b,file=a.hprof 24984
Dumping heap to C:\Users\LENOVO\a.hprof ...
Heap dump file created
这样堆内存快照就在指定的文件夹中创建完成了,可以使用其他工具(如 Eclipse Memory Analyzer)分析堆内存的具体细节。
四、-finalizerinfo参数
打印正等候回收的对象的信息
jmap -finalizerinfo 24984
C:\Users\LENOVO>jmap -finalizerinfo 24984
Attaching to process ID 24984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
Number of objects pending for finalization: 0 //(等待回收的对象为0)
六、-clstats 参数
该参数打印classload的信息。包含每个classloader的名字、活泼性、地址、父classloader和加载的class数量
jmap -clstats 24984
C:\Users\LENOVO>jmap -clstats 24984
Attaching to process ID 24984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness.............................................................liveness analysis may be inaccurate ...
class_loader classes bytes parent_loader alive? type
<bootstrap> 2705 4589209 null live <internal>
0x00000006c2513350 1 880 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3350130 1 880 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c2513e58 1 1472 null dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3350838 1 880 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3351d38 1 1473 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3355838 1 1472 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
评论区
请写下您的评论...
猜你喜欢
java基础
1249
核心类ZipInputStream的api文档请参考:https://nowjava.com/docs/java-api-11/java.base/java/util/zip
blog
Java内存区域与内存溢出异常
java基础
3751
描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧[1](StackFrame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直
blog
jvm内存模型分析(2)之方法执行的过程
java虚拟机(jvm)
4768
jvm内存模型分析(1)已经对内存模型进行了一个宏观的概括http://www.jiajiajia.club/weblog/blog/artical/82那么下边具体分析一下方法执行的过程还是以一个
java虚拟机(jvm)
2464
这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等。参考资料深入理解java虚拟机《周志明》1.对象的内存布局HotSpot虚拟机中,对象在内存中存储的布局可以
blog
java压缩zip工具类
工具
1674
java压缩zip工具类packagecom.dzqc.yx.util;importjava.io.File;importjava.io.FileInputStream
file
winrar压缩工具(windows)
win rar
989
winrar压缩工具(windows)自从电脑被p2p垃圾软件恶意捆绑了一堆垃圾软件后,对这种软件有了后遗症。安装的时候要小心。
反编译
1393
java反编译工具(class、jar)jd-gui
java虚拟机(jvm)
3574
jvm内存模型分析(5)堆内存溢出以及分析1.模拟堆内存溢出代码packagetest;importjava.util.ArrayList;importjava.util.List
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。