利用Jmap+MemoryAnalyzer进行OutOfMemoryError的诊断分析

转: http://blog.csdn.net/zapldy/article/details/7727572

这篇帖子只介绍利用MemoryAnalyzer进行简单的JVM的堆的分析,至于JVM的内部结构是怎么样的,这里不进行分析。好吧,废话不多说;首先如果我们要分析JVM某个时刻的Heap的对象分配情况,我们就必须要dump这个时刻的JVM的heap(堆);有以下几个办法进行dump某个时刻JVM的heap内容:

1、 使用$JAVA_HOME/bin/jmap -dump来触发,
eg:jmap-dump:format=b,file=/home/longhao/heamdump.out <pid>
2、 使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>dumpHeap中,点击 dumpHeap按钮。生成的dump文件在 java应用的根目录下面。
3、在应用启动时配置相关的参数 -XX:+HeapDumpOnOutOfMemoryError,当应用抛出OutOfMemoryError时生成dump文件。
4、使用hprof。启动虚拟机加入-Xrunhprof:head=site,会生成java.hprof.txt文件。该配置会导致jvm运行非常的慢,不适合生产环境。

利用MemoryAnalyzer进行Heap分析
去eclipse官网上去下载MemoryAnalyzer,可以下载非插件版的,这样MemoryAnalyzer运行起来比较快,如果是eclipse插件版进行可能会导致eclipse卡死。本人下载的版本是MemoryAnalyzer-1.2.0.20120530-win32.win32.x86_64。
一、Java代码样例


package org.ph.javaee.javaheap;


import java.util.Map;

import java.util.HashMap;


/**

* JVMOutOfMemoryErrorSimulator

*

* @author PH

*

*/

public class JVMOutOfMemoryErrorSimulator {

private final static int NB_ITERATIONS = 500000;

// ~1 KB data footprint

private final static String LEAKING_DATA_PREFIX = "datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata";

// Map used to stored our leaking String instances

private static Map<String, String> leakingMap;

static {

leakingMap = new HashMap<String, String>();

}


public static void main(String[] args) {

System.out.println("JVM OutOfMemoryError Simulator 1.0");

System.out.println("Author: Pierre-Hugues Charbonneau");

System.out.println("http://javaeesupportpatterns.blogspot.com/");

try {
for (int i = 0; i < NB_ITERATIONS; i++) {
String data = LEAKING_DATA_PREFIX + i;

// Add data to our leaking Map data structure...

leakingMap.put(data, data);
}

} catch (Throwable any) {

if (any instanceof java.lang.OutOfMemoryError) {

System.out.println("OutOfMemoryError triggered! "

+ any.getMessage() + " [" + any + "]");
} else {

System.out.println("Unexpected Exception! " + any.getMessage()

+ " [" + any + "]");
}
}
System.out.println("simulator done!");

}
}


二、设置JVM启动参数
在此我们把JVM堆的最大内存设置为512m,并且让程序运行过程中出现内存溢出的时候会dump当时的JVM对内存的内容,所以需要加上XX:+HeapDumpOnOutOfMemoryError参数;因此按照以下步骤在eclipse中加入启动参数


从以上的输出结果来看,此程序已经抛出了OutOfMemoryError了,并且生成了一个heap文件,文件名为java_pid3880.hprof,下一步我们就可以拿这个文件在MemoryAnalyzer分析了。


三、有时 jmap 导出 dump文件无效,或者提示要用-F 参数导出 ,上次成功过一次 ,忘记记录下来了 ,有时间找下
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值