Day13-JDK堆内存快照工具-jmap(三)自动导出内存映像文件

前言

接续着上篇,这篇要说明的是如何自动导出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


<<:  D14/ 怎麽做拉动的操作? - Draggable Gesture

>>:  消费者模型,买它到八卦它

[DAY-30] 最後一幕只是故事的结尾,你也知道故事没有结尾是行不通的。

And So It Is. 其实想说一些三八的话,BUT 没有 FU XDDD 好啦三十天 ya!...

[Day26] 求值策略

Call by Value 传值 Call by Reterence 传参照 Call by Sh...

Day19 - AVL tree

大家好,我是长风青云。今天是铁人赛第十九天。 这是今天的影片。 来说个题外话。 今天下午我在看云端课...

Day9 Goroutine

并发 vs并行 并发运算就是多线程运算,且并发(concurrency)并非并行(Paralleli...

codepen

如何载入CND 1.Fork 2.齿轮 ...