java 崩溃时dump_java 遇到未知异常使程序崩溃,输出jvm的dump崩溃信息到指定文件,然后杀死此进程...

1.我们首先需要获取当前java进程的pid。方法为:

//查看当前进程pid

private static void getPID(){

RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();

String name = runtime.getName();

System.out.println("当前进程的标识为:"+name);

int index = name.indexOf("@");

if (index != -1) {

int pid = Integer.parseInt(name.substring(0, index));

System.out.println("当前进程的PID为:"+pid);

}

}

假设该进程pid为8643

windows下执行命令:taskkill /pid 8436 /f 来强制终止该pid进程。

linux下执行:kill-9 8643来强制终止该pid进程

2.导出jvm中内存信息

jmap -dump:format=b,file=文件名 [pid]

3.java方法调用shell命令

String cmds = "jmap -dump:format=b,file=e:/jmap/"+System.currentTimeMillis()+".hprof "+pid;

Process pro = Runtime.getRuntime().exec(cmds);

pro.waitFor();

in = pro.getInputStream();

BufferedReader read = new BufferedReader(new InputStreamReader(in));

String result = read.readLine();

System.out.println(result);

上述代码就可以将制定pid的java进程的dump文件以文件的形式输出到制定目录下。

问题:在cmds命令中,hprof与pid之间一定要有空格。

4.有些linux系统可能不能执行jmap命令:此时需要yum安装即可。

yum install java-1.8.0-openjdk-devel-debug

5.输出的java dump文件格式是.hprof格式的。我们需要特定的工具才能解析。

这里推荐MAT(Eclipse的一种插件)。官网下载地址如下,下载完解压即可。

MAT是有两种安装方式的,这一点与其他eclipse插件略有不同。

一种安装方式是将MAT当做eclipse的插件进行安装:启动Eclipse –> Help –> Eclipse Marketplace,然后搜索Memory Analyzer,安装,重启eclipse即可。

另外一种安装方式是将MAT作为一个独立的软件进行安装:去官网http://www.eclipse.org/mat/downloads.php,根据操作系统版本下载最新的MAT。下载后解压就可以运行了。

修改MAT配置:

MAT 软件版本解压后目录内有个MemoryAnalyzer.ini文件,该文件里面有个Xmx参数,该参数表示最大内存占用量,默认为1024m,根据堆转储文件大小修改该参数即可。

1. MemoryAnalyzer.ini中的参数一般默认为-vmargs– Xmx1024m,这就够用了。假如你机器的内存不大,改大该参数的值,会导致MemoryAnalyzer启动时,报错:Failed to create the Java Virtual Machine。

2.当你导出的dump文件的大小大于你配置的1024m(说明1中,提到的配置:-vmargs– Xmx1024m),MAT输出分析报告的时候,会报错:An internal error occurred during: “Parsing heap dump from XXX”。适当调大说明1中的参数即可。

执行MemoryAnalyzer.exe打开软件,然后打开file–openfile选择前面生成的.hprof文件。就可以看到信息。如下图。

12a480fcdeecb58fde21ceb480170712.png

在首页上比较有用的是Histogram和Leak Suspects。

点击Histogram,看到下图:

846093484f26d63505112b5c17b1c66c.png

点击Leak Suspects会在堆转储文件同目录内生成一个Leak Suspects.zip文件,同时也会从首页跳转到Leak Suspects页面。

f7d0555408304d5c1394f0475bff48cd.png

在Leak Suspects页面会给出可能的内存泄露,如上图所示有一个可能的内存泄露。这个问题是jar包或jdk里面的,所以我们不用管。(因为我这个生成.hprof文件并不是内存泄漏时生成的,而是为了测试,强制生成的)

我们可以点击 details进去查看详细信息。

9f8266a772ab83002cd83048c3618785.png

在详情页面Shortest Paths To the Accumulation Point表示GC root到内存消耗聚集点的最短路径,如果某个内存消耗聚集点有路径到达GC root,则该内存消耗聚集点不会被当做垃圾被回收。

在All Accumulated Objects by Class列举了该对象所存储的所有内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值