`
bdk82924
  • 浏览: 553125 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

利用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 参数导出 ,上次成功过一次 ,忘记记录下来了 ,有时间找下
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics