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
  1. 使用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.

 

 

 

 

 

 

  1. -XX:+HeapDumpBeforeFullGC
    当 JVM 执行 FullGC 前执行 dump。
  1. -XX:+HeapDumpAfterFullGC
    当 JVM 执行 FullGC 后执行 dump。
  1. -XX:+HeapDumpOnCtrlBreak
    交互式获取dump。在控制台按下快捷键Ctrl + Break时,JVM就会转存一下堆快照。
  1. -XX:HeapDumpPath=c:\test.hprof
    指定 dump 文件存储路径。

注意:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。

4. 使用其它工具获取dump文件

分析 Heap Dump 的工具都可以获取 Heap Dump 文件。
比如:jdk 自带的工具 jvisualvm。
其它工具:Eclipse memory analyzer(jmat)、JProfiler 等。

转载出处: https://www.jianshu.com/p/91ee6476848c

posted @ 2022-04-22 15:31  LilLazy  阅读(1038)  评论(0编辑  收藏  举报