Java如何生成Heap Dump及OOM问题排查
Heap Dump简述
Heap dump
文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。Heap Dump
文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Dump
一般都包含了一个堆中的Java Objects, Class等基本信息。同时,当你在执行一个转储操作时,往往会触发一次GC,所以你转储得到的文件里包含的信息通常是有效的内容(包含比较少,或没有垃圾对象了) 。我们可以这么理解:heap dump记录内存信息的,thread dump是记录CPU信息的。
Heap Dump 包含的信息
- 所有的对象信息
对象的类信息、字段信息、原生值(int, long等)及引用值 - 所有的类信息
类加载器、类名、超类及静态字段 - 垃圾回收的根对象
根对象是指那些可以直接被虚拟机触及的对象 - 线程栈及局部变量
包含了转储时刻的线程调用栈信息和栈帧中的局部变量信息
Heap Dump 获取方式
1. 使用 jmap 命令生成 dump 文件
eg. 1. 在windows主机上面通过tasklist
获取进程pid
C:\Program Files (x86)\PowerCmd>tasklist
- 使用
jmap
命令生成heap dump文件
C:\ProgramFiles\Java\jdk1.8.0_144\bin>jmap -dump:live,format=b,file=c:\dumptest\heap1.hprof 13444
Dumping heap to C:\dumptest\heap1.hprof ...
Heap dump file create
3.使用使用jprofiler
打开生成的heap1.hprof
文件
如上图所示,红色圈出来的即为占用内存最多的对象,也是最可能发生OOM问题的地方;
2. 使用 jcmd 命令生成 dump 文件
jcmd <pid> GC.heap_dump c:\dump\heap.hprof
3. 使用 JVM 参数获取 dump 文件
1. -XX:+HeapDumpOnOutOfMemoryError
当OutOfMemoryError发生时自动生成 Heap Dump 文件。
这可是一个非常有用的参数,因为当你需要分析Java内存使用情况时,往往是在OOM(OutOfMemoryError)发生时。
eg.
- -XX:+HeapDumpBeforeFullGC
当 JVM 执行 FullGC 前执行 dump。
- -XX:+HeapDumpAfterFullGC
当 JVM 执行 FullGC 后执行 dump。
- -XX:+HeapDumpOnCtrlBreak
交互式获取dump。在控制台按下快捷键Ctrl + Break时,JVM就会转存一下堆快照。
- -XX:HeapDumpPath=c:\test.hprof
指定 dump 文件存储路径。
注意:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。
4. 使用其它工具获取dump文件
分析 Heap Dump 的工具都可以获取 Heap Dump 文件。
比如:jdk 自带的工具 jvisualvm。
其它工具:Eclipse memory analyzer(jmat)、JProfiler 等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)