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 指定导出堆信息时的路径或文件名