iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

展開JDK工具的30天應用之旅系列 第 13

Day13-JDK堆內存快照工具-jmap(三)自動導出內存映像文件

  • 分享至 

  • xImage
  •  

前言

接續著上篇,這篇要說明的是如何自動導出hprof文件,針對自動導出又有分兩種狀況:已是運行中的程序要調整JVM參數、剛要執行的程序帶上自動導出的參數,以下我示範的是剛要執行的程序帶上自動導出的參數已在運行中要調整的話,請參考:Day10-JDK查看虛擬機配置訊息工具:jinfo

  • 自動導出

當程序遇到out of memory (OOM)時,會馬上停止,一些系統的相關訊息也會隨之消失,所以自動導出文件這動作就顯得相當重要。

以下兩個參數是自動導出的關鍵:

  1. -XX:+HeapDumpOnOutOfMemoryError:程序發生OOM時,可產生內存快照。
  2. -XX:HeapDumpPath=<filename.hrpof>:可指定內存快照保存位置。

以下為示範內容

Step1. 準備一個JmapDump.java檔案,程式碼如下:

package Controller;

import java.util.ArrayList;

public class JmapDump{

  public static void main(String[] args) throws InterruptedException{
    ArrayList<String[]> list = new ArrayList<>();
	    for(int x = 0;x<2001;x++){
	    	String[] arr = new String[1024*x];
	    	list.add(arr);
	    	Thread.sleep(50);
	     }
  }
}

Step2.將程式碼進行編譯

編譯與執行的指令說明,請參考Day4-java語言編譯器:javac & 運行工具:java (上)

Step3.將編譯過後的程式運行,並帶上自動導出文件的參數

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=auto.hprof Controller/JmapDump

Step4.放著讓程序自己跑,大約過85秒後就會自動出現java.lang.OutOfMemoryError: Java heap space的狀況,並且自動匯出文件

https://ithelp.ithome.com.tw/upload/images/20210928/20140481wCp0VrObgd.png
出現java.lang.OutOfMemoryError: Java heap space後,下一行的顯示訊息是Dumping heap to auto.hprof ...,等它整個訊息顯示完後,到HeapDumpPath設定的路徑下查看是否有hprof的文件

https://ithelp.ithome.com.tw/upload/images/20210928/20140481r4yeg697rO.png

心得

這工具就是促使我開始研究JDK內有哪些工具的契機!!不得不說,jmap在遇到OOM時真的很好用~
當時我遇到的狀況是,公司的網站不定期就會整個掛掉,偏偏那時又是流量高峰的時候,當時就覺得很困惑,沒動過code,好好的網站怎麼會突然出現問題,使用了jmap搭配接下來要講的工具,讓我能在網站上眾多的功能中不需要大海撈針找問題!!
/images/emoticon/emoticon13.gif


上一篇
Day12-JDK堆內存快照工具-jmap(二)手動導出內存映像文件
下一篇
Day14-hprof文件分析工具:mat(一)
系列文
展開JDK工具的30天應用之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言