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 指定導出堆信息時的路徑或文件名

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM