Java程序生成Heap dump几种方式

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 获取方式

使用 jmap 命令生成 dump 文件

jmap -dump:live,format=b,file=c:\dump\heap.hprof [pid]

(1) 查看java进程pid

windows:

在windows主机上面通过tasklist获取java进程的pid。

linux:

ps -ef|grep java

(2) 使用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 created

使用 jcmd 命令生成 dump 文件

jcmd <pid> GC.heap_dump c:\dump\heap.hprof

使用 JVM 参数获取 dump 文件

在idea中的VM options中配置:
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=D:\software\mat\dump

运行jar包时候指定JVM参数

java -Xms750m -Xmx750m -Xmn512m -Xss1024k -XX:MaxPermSize=128m
-XX:+UseConcMarkSweepGC 
-XX:CMSFullGCsBeforeCompaction=5
-XX:SurvivorRatio=8 (新生代分区比例 8:2)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器)
-XX:+UseCMSCompactAtFullCollection 
-XX:+PrintGC -XX:+PrintGCDetails
-XX:+PrintGCTimeStamps -Xloggc:/tmp/jvm.log 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/tmp/heapdump.hprof
-Dfile.encoding=utf-8 -jar /data/app/test.jar

参数说明:

-Xms750m表示堆内存初始值
-Xmx750m堆内存最大值
-Xmn512m 设置年轻代大小为512m。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-Xss1024k 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:MaxPermSize=128m 设置永久代的大小,此属性在jdk8之后不再提供。
-XX:+UseCMSCompactAtFullCollection 打开对年老代的压缩。可能会影响性能,但是可以消除内存碎片
-XX:+PrintGC 每次GC时打印相关信息
-XX:+PrintGCDetails 每次GC时打印详细信息
-XX:+PrintGCTimeStamps 打印每次GC的时间戳
-Xloggc:/tmp/jvm.log 设置垃圾回收日志打印的文件,文件名称可以自定义
-XX:+HeapDumpOnOutOfMemoryError 设置当首次遭遇内存溢出时导出此时堆中相关信息
-XX:HeapDumpPath=/tmp/heapdump.hprof 指定导出堆信息时的路径或文件名

 

posted @ 2021-11-26 11:59  残城碎梦  阅读(2610)  评论(0编辑  收藏  举报