JVM堆转存文件生成与分析
文件内容
堆转存文件包含一下内容:
- 所有对象 - 对象所对应的类、字段、原生数据类型以及引用。
- 所有类 - Classloader、类名、超类以及静态字段。
- 垃圾回收器的根 - Java 垃圾回收就是使用它,进行可达性分析,从而判定一个对象是否可以被回收。
- 线程堆栈与本地变量。
自动生成模式
我们可以在 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控制台
- Jconsole (Java Monitoring and Management Console),是 JDK 自带的监控 、管理工具 。
- 首先双击 ${JDK_HOME}/bin/jconsole.exe,打开进程连接列表,选择我们需要 dump 的进程:
- 默认是使用 SSL,本地一般不会用到,所以这里直接选择 “不安全的连接”:
- 连接成功后,就会进入监控概览:
依次选择 MBean → com.sun.management 下 HostSpotDiagnosic 中的 dumpHeap,在 p0 中输入 hprof 文件的导出路径,这样就可以生成堆转储文件啦:
jvisualvm控制台
连接指定的服务后,选择监视->堆 Dump 生成文件,会自动放到一个目录,注意看这个工具感觉比jconsole好用,支持查看的信息多一点
分析工具
- 使用 IBM HeapAnalyzer 网上搜索 ha456.jar包 或者 ha457,下载打开即用(https://public.dhe.ibm.com/software/websphere/appserv/support/tools/HeapAnalyzer/ha457.jar)
- 如果本机就可以调试,可以使用jdk自带的 jvisualvm ,配置好jdk环境变量后,直接输入jvisualvm命令即可打开软件,启动项目程序后,在这个软件中可以看到进程,进入进程实时看变化
- 在线的分析网站(https://gceasy.io)
- 如果是使用idea开发工具,可以直接将拿到的堆转存文件拖拽到idea中,它会自动分析,这个比较好用