欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

快速了解:jmap工具——检查对象实例数量及内存使用情况

最编程 2024-02-10 15:48:36
...

目录

1、查看实例信息

2、查看堆信息

3、堆内存dump+jvisualvm(可视化)


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文件(内存很大的时候,可能会导不出来)

  1. -XX:+HeapDumpOnOutOfMemoryError
  2. -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;
    }
}