Java生成堆內(nèi)存dump的問(wèn)題
Java生成堆內(nèi)存dump
在處理壓力測(cè)試問(wèn)題的時(shí)候,遇到OOM的情況,這時(shí)候我們需要去記錄內(nèi)存實(shí)時(shí)的情況,一般會(huì)打出一個(gè)dump文件,而后再使用MAT等內(nèi)存分析工具去查看哪些對(duì)象一直占用了大量?jī)?nèi)存,最終分析出代碼需要優(yōu)化的地方。
那么java如何打出dump文件呢?
java提供了jmap命令,如下:
jmap -dump:format=b,file=/path/heap.bin 進(jìn)程ID ? jmap -dump:live,format=b,file=/path/heap.bin 進(jìn)程ID ?
live參數(shù):
表示我們需要抓取目前在生命周期內(nèi)的內(nèi)存對(duì)象,也就是說(shuō)GC收不走的對(duì)象,然后我們絕大部分情況下,需要的看的就是這些內(nèi)存。而且會(huì)減小dump文件的大小。
在命令行下可以直接運(yùn)行,當(dāng)然使用java也可以按指定方式執(zhí)行,示例如下:
package com.szh;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
public class TestDump {
public static void main(String[] args) throws InterruptedException, IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
Runtime runtime = Runtime.getRuntime();
Scanner scanner = new Scanner(System.in);
System.out.println("請(qǐng)輸入java進(jìn)程PID:");
int pID = scanner.nextInt();
System.out.println("請(qǐng)輸入dump文件輸出路徑:");
String dumpPath = scanner.next();
scanner.close();
if (!dumpPath.endsWith(File.separator)) {
dumpPath = dumpPath + File.separator;
}
String cmd = "jmap -dump,format=b,file=" + dumpPath + "_" + sdf.format(new Date()) + ".bin " + pID;
runtime.exec(cmd);
TimeUnit.SECONDS.sleep(5L);
while (true) {
cmd = "jmap -dump:live,format=b,file=" + dumpPath + "_" + sdf.format(new Date()) + ".bin " + pID;
Process process = runtime.exec(cmd);
/*InputStreamReader isr = new InputStreamReader(process.getInputStream(), "GBK");
BufferedReader br = new BufferedReader(isr);
while (true) {
String str = br.readLine();
if (str == null) {
break;
}
System.out.println(str);
}*/
TimeUnit.HOURS.sleep(1L);
}
}
}注意:對(duì)象越多dump耗時(shí)越久,且dump會(huì)導(dǎo)致STW。
如果在生產(chǎn)中,可以加以下參數(shù),在OOM時(shí)(已經(jīng)STW了)自動(dòng)打dump,
-XX:+HeapDumpOnOutOfMemoryError
jvm生成dump文件
JVM生成dump文件一般有兩種方式
出現(xiàn)OOM時(shí)自動(dòng)生成堆dump
JVM啟動(dòng)命令增加兩個(gè)參數(shù):
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/app/dumps/
人工通過(guò)執(zhí)行指令,直接生成當(dāng)前JVM的dump文件
例如:
jmap -dump:format=b,file=/home/app/testdump.hprof 6218
其中6218是JVM的當(dāng)前進(jìn)程號(hào)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
kafka并發(fā)寫大消息異常TimeoutException排查記錄
這篇文章主要為大家介紹了kafka并發(fā)寫大消息異常TimeoutException的排查記錄及解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
java非公平鎖知識(shí)點(diǎn)實(shí)例詳解
在本篇文章里小編給大家整理了一篇關(guān)于java非公平鎖知識(shí)點(diǎn)實(shí)例詳解,有興趣的朋友們可以學(xué)習(xí)參考下。2021-10-10
Springboot日志開(kāi)啟SLF4J過(guò)程解析
這篇文章主要介紹了Springboot日志開(kāi)啟SLF4J過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Spring中的SpringData詳細(xì)說(shuō)明
這篇文章主要介紹了Spring中的SpringData詳細(xì)說(shuō)明,Spring Data 是Spring 的一個(gè)子項(xiàng)目, 旨在統(tǒng)一和簡(jiǎn)化對(duì)各類型持久化存儲(chǔ), 而不拘泥于是關(guān)系型數(shù)據(jù)庫(kù)還是NoSQL 數(shù)據(jù)存儲(chǔ),需要的朋友可以參考下2023-11-11
Java class文件格式之常量池_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java class文件格式之常量池的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
SpringBoot基于HttpMessageConverter實(shí)現(xiàn)全局日期格式化
這篇文章主要介紹了SpringBoot基于HttpMessageConverter實(shí)現(xiàn)全局日期格式化,使用Jackson消息轉(zhuǎn)換器,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-12-12

