目录
jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。
可以使用jmap生成Heap Dump。
1、查看实例信息
前置启动程序
事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用
C:\Users\swadi>jps
19672 Jps
12204 MyApplication #本地启动的Java进程
查看实例信息,用来输出到本地log.txt文件
jmap -histo 12204 > ./log.txt
jmap -histo 12204 #查看历史生成的实例
jmap -histo:live 12204 #查看当前存活的实例,执行过程中可能会触发一次full gc
打开log.txt,文件内容如下:
- num:序号
- instances:实例数量
- bytes:占用空间大小
- class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]
2、查看堆信息
查看堆信息
F:\>jmap -heap 12204
3、堆内存dump+jvisualvm(可视化)
dump 堆到文件,format 指定输出格式,live 指明是活着的对象,file 指定文件名
jmap -dump:live,format=b,file=java.hprof 12204
也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=./ (路径)
示例代码:
public class OOMTest {
// JVM设置 堆大小为5M
// -Xms5M -Xmx5M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:\jvm.dump
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
int i = 0;
int j = 0;
while (true) {
list.add(new User(i++, UUID.randomUUID().toString()));
new User(j--, UUID.randomUUID().toString());
}
}
}
可以用jvisualvm命令工具导入该dump文件分析,文件->装入
附:User.java类
public class User {
private int id;
private String name;
//大对象属性
byte[] a = new byte[1024 * 100];
public User() {
}
public User(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
版权声明:本文为swadian2008原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。