文件内容

堆转存文件包含一下内容:

  1. 所有对象 - 对象所对应的类、字段、原生数据类型以及引用。
  2. 所有类 - Classloader、类名、超类以及静态字段。
  3. 垃圾回收器的根 - Java 垃圾回收就是使用它,进行可达性分析,从而判定一个对象是否可以被回收。
  4. 线程堆栈与本地变量。

    自动生成模式

    我们可以在 JVM 中配置:

    • -XX:+HeapDumpOnOutOfMemoryError,这样在发生内存溢出异常(OutOfMemoryError)时,就会在工作目录中,自动生成堆转储文件。
    • -XX:HeapDumpPath=/Users/tanjun/Downloads/heapdump.hprof 配置堆转存生成目录

      手动生成模式

      jmap命令

      jmap -dump:format=b,file=

    • 其中的 format=b,表示转储为二进制格式。
    • file 指定转储文件的路径,后缀为 hprof。
    • pid 表示进程 ID。

在 windows cmd 中,可以使用命令 tasklist 来查看进程 ID。

jconsole控制台

  1. Jconsole (Java Monitoring and Management Console),是 JDK 自带的监控 、管理工具 。
  2. 首先双击 ${JDK_HOME}/bin/jconsole.exe,打开进程连接列表,选择我们需要 dump 的进程:
  3. 默认是使用 SSL,本地一般不会用到,所以这里直接选择 “不安全的连接”:
  4. 连接成功后,就会进入监控概览: 依次选择 MBean → com.sun.management 下 HostSpotDiagnosic 中的 dumpHeap,在 p0 中输入 hprof 文件的导出路径,这样就可以生成堆转储文件啦:

    jvisualvm控制台

    连接指定的服务后,选择监视->堆 Dump 生成文件,会自动放到一个目录,注意看这个工具感觉比jconsole好用,支持查看的信息多一点

分析工具

  1. 使用 IBM HeapAnalyzer 网上搜索 ha456.jar包 或者 ha457,下载打开即用(https://public.dhe.ibm.com/software/websphere/appserv/support/tools/HeapAnalyzer/ha457.jar)
  2. 如果本机就可以调试,可以使用jdk自带的 jvisualvm ,配置好jdk环境变量后,直接输入jvisualvm命令即可打开软件,启动项目程序后,在这个软件中可以看到进程,进入进程实时看变化
  3. 在线的分析网站(https://gceasy.io)
  4. 如果是使用idea开发工具,可以直接将拿到的堆转存文件拖拽到idea中,它会自动分析,这个比较好用