iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
自我挑戰組

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

Day12-JDK堆內存快照工具-jmap(二)手動導出內存映像文件

  • 分享至 

  • xImage
  •  

前言

上一篇介紹了jmap基本的應用,接著就要講jmap的重點!!導出內存映像文件,而導出的方式分為兩種:手動、自動。這篇會先介紹如何手動導出hprof文件

  • 手動導出內存映像

jmap -dump:[live,] format=b, file=<filename> <pid>

任何時候想導出皆可使用此指令進行,但要注意!!若程式出現崩潰OutOfMemoryError: Java heap space,手動的方式肯定是來不及匯出文件,只要一出現上面這錯誤,tomcat的process便會直接停止,故也無法進行dump了。

以下為示範內容

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

package Controller;

import java.util.ArrayList;

public class JmapDump{

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

Step2.將程式碼進行編譯並且執行

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

Step3.要進行查看jstat前,須先知道要查看哪個HotSpot進程

透過jps查看,請參考Day7-JDK查看正在運行的Java進程工具:jps
https://ithelp.ithome.com.tw/upload/images/20210927/20140481aHW1PJnW4o.png
我查到我這次的進程是6597,以下示範的指令記得將6597改為欲查看的進程id喔!

Step4.手動導出內存映像

jmap -dump:format=b,file=manual.hprof 6597

✎tips

  1. 這程式差不多預計執行69秒時,會OutOfMemoryError: Java heap space
  2. 所以我分了兩次導出,一次(檔名:manual.hprof)在程式剛運行沒多久,第二次(檔名:manual1.hprof)在接近69秒時,檔案大小差異滿大的!!75.1MB與3.74GB的差異
  3. 檔名不可重複。若filename使用了一樣的檔名,會出現File exists訊息
    https://ithelp.ithome.com.tw/upload/images/20210927/20140481t2eobDp8dw.png
  4. 導出後檔案先別急著刪掉!!預計下下篇會使用到

https://ithelp.ithome.com.tw/upload/images/20210927/20140481KS9cEZzLio.png

https://ithelp.ithome.com.tw/upload/images/20210927/20140481qLVM3HpdOz.png

下篇會接著介紹如何自動導出hprof文件


上一篇
Day11-JDK堆內存快照工具-jmap(一)基本應用
下一篇
Day13-JDK堆內存快照工具-jmap(三)自動導出內存映像文件
系列文
展開JDK工具的30天應用之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言