Day12-JDK堆内存快照工具-jmap(二)手动导出内存映像文件

前言

上一篇介绍了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文件


<<:  D21 Django-bootstrap 网站美化工程 (1)

>>:  Day12 - LinkList

资产剥离(divestiture)

首先考虑范围内的资产更为有效,因为业务中断,知识产权泄漏和数据隐私不合规是范围内资产所产生的影响或...

[day22] 快速产生测试资料

功能测试时很常需要删掉坏掉的资料库纪录,这时就需要重置测资,但每次都开管理工具来做太麻烦了,写个小工...

MacOS读取蓝牙摇杆讯号,利用python修改pynput程序码实现 - 3.修改pynput

请参考之前的文章:第二篇 5. 修改pynput if event_type == Quartz.N...

Microsoft Azure Pass 学习日志 Day 5

Chap.VI Management + Governance 管理方法 Advisor 概观 这边...

[前端暴龙机,Vue2.x 进化 Vue3 ] Day19.组件练习 ref -分页(二)

今天我们会利用上一篇的 分页组件 范例来做更改,不过差别在於,这次我们父子组件的沟通不是透过 pro...