网站首页 > 知识剖析 正文
jdk安装后会自带一些小工具,jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程的共享对象内存映射或堆内存细节。
jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。可以使用jmap生成Heap Dump。
语法:jmap [option] 参数
option:
heap : 显示Java堆详细信息
histo : 显示堆中对象的统计信息
permstat :Java堆内存的永久保存区域的类加载器的统计信息
finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump : 生成堆转储快照
F : 当-dump没有响应时,强制生成dump快照
参数:
pid:java进程id,命令ps -ef | grep java获取
executable:产生核心dump的java可执行文件
core:需要打印配置信息的核心文件
remote-hostname-or-ip:远程调试的主机名或ip
server-id:可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器
命令使用:
1、jmap -heap pid 展示pid的整体堆信息 #ps -ef|grep tomcat #获取tomcat的pid
public class Test6 {
public static void main(String[] args) throws Exception {
// 创建一个10M的byte数组
byte[] by = new byte[1024 * 1024 * 10];
Thread.sleep(10000);
}
}
我们看下上面代码创建一个10M的byte数组后,堆内存里面的变化:
我们具体分析下上图的结果
Heap Usage:
PS Young Generation
Eden Space: //堆内存:新生代Eden区
//新生代Eden区总容量 16M (这里的值每个人的显示的值不一样的,看自己电脑的内存大小)
capacity = 16777216 (16.0MB)
//已经使用了11点多M,这里就包含了我们上面代码创建的一个10M的byte数组
used = 11828456 (11.280494689941406MB)
free = 4948760 (4.719505310058594MB) //新生代Eden区 空闲(剩余)内存还有4.7M
70.50309181213379% used
From Space: //堆内存:新生代From区
capacity = 2621440 (2.5MB) //新生代From区总内存
used = 0 (0.0MB) //新生代From区 已经使用0M
free = 2621440 (2.5MB)//新生代From区 剩余2.5M空间
0.0% used
To Space: //堆内存:新生代To区
capacity = 2621440 (2.5MB) //新生代To区总容量
used = 0 (0.0MB) //新生代To区已经使用0M
free = 2621440 (2.5MB) //新生代To区 剩余内存
0.0% used
PS Old Generation //堆内存:老年代
capacity = 45088768 (43.0MB) //老年代总内存
used = 0 (0.0MB) //老年代已经使用0M
free = 45088768 (43.0MB) //老年代剩余43M
0.0% used
2、获取堆上面所有活动的类(包括类对象的的数量,和总共大小):jmap -histo:live PID
import java.util.ArrayList;
import java.util.List;
public class Test6 {
public static void main(String[] args) throws Exception {
//创建一个Student01的集合
List<Student01> studentList = new ArrayList<Student01>();
for (int i = 0; i < 100; i++) {
//循环添加一个Student01对象到集合中
studentList.add(new Student01(i, "zhangsan" + i, i));
}
Thread.sleep(10000000);
}
}
使用jmap -histo:live PID查询结果:
C:\Users\Administrator>jmap -histo:live 212
num #instances #bytes class name
----------------------------------------------
1: 2374 304696 [C
2: 513 58400 java.lang.Class
3: 2232 53568 java.lang.String
4: 836 33440 java.util.TreeMap$Entry
5: 542 31088 [Ljava.lang.Object;
6: 20 25832 [B
7: 195 7976 [Ljava.lang.String;
8: 79 5688 java.lang.reflect.Field
9: 256 4096 java.lang.Integer
10: 97 3880 java.lang.ref.SoftReference
11: 60 3840 java.net.URL
12: 93 3616 [I
13: 113 3616 java.util.Hashtable$Entry
14: 86 2752 java.util.HashMap$Node
15: 7 2632 java.lang.Thread
16: 100 2400 Student01 //看到了吗,我们的类在这里数量:100,占用2400个字节
17: 49 1960 java.util.LinkedHashMap$Entry
18: 57 1824 java.util.concurrent.ConcurrentHashMap$Node
3、堆到文件:jmap -dump:live,format=b,file=dump.hprof PID
dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
[root@localhost jdk1.7.0_79]# jmap -dump:live,format=b,file=dump.hprof 24971
Dumping heap to /usr/local/java/jdk1.7.0_79/dump.hprof ...
Heap dump file created
猜你喜欢
- 2024-12-08 互联网地图坐标系简介及转换(地理坐标系)
- 2024-12-08 Jmap导出java运行中的堆内存dump及Jprofiler分析方法
- 2024-12-08 WeakMap和Map的区别,WeakMap原理,为什么能被 GC?
- 2024-12-08 如何测量纳米粒粒径及做粒径分布图
- 2024-12-08 go语言中的map详解
- 2024-12-08 JVM系列-使用jmap和MAT进行堆内存分析
- 2024-12-08 ThreeJS 给全景图片添加标注
- 2024-12-08 长“痤疮”毁颜值?这样吃就对了
- 2024-12-08 JVM性能调优监控工具jps、jstack、jmap、jhat、hprof使用详解
- 2024-12-08 JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)