`
bdk82924
  • 浏览: 562175 次
  • 性别: 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 参数导出 ,上次成功过一次 ,忘记记录下来了 ,有时间找下
分享到:
评论

相关推荐

    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    本文将详细介绍如何利用 Eclipse Memory Analyzer (MAT) 工具来诊断并解决 Tomcat 服务器上的 Java 应用程序内存溢出问题。 #### 二、内存溢出的原因及处理思路 ##### 2.1 内存泄露 - **定义**:内存泄露是指不再...

    Memory Analyzer (MAT) windows64位版本

    本文将详细介绍MAT在Windows 64位系统中的使用,以及如何利用MAT对dump文件进行分析。 MAT是一款免费且开源的Java内存分析工具,它能够帮助我们识别内存泄漏、分析对象引用链以及计算对象的内存占用情况。在Windows...

    MemoryAnalyzer.zip

    这时,我们就需要借助专业的工具进行内存分析,而MemoryAnalyzer(MAT)正是这样一款强大的JVM内存诊断工具。本文将深入探讨MAT的使用方法、功能以及它如何帮助我们解决内存问题。 MAT,全称Memory Analyzer Tool,...

    jmap工具~MA.zip

    Eclipse Memory Analyzer Tool (MAT) 是一个强大的内存分析工具,可以读取由jmap生成的.hprof文件,进行详细的内存分析。它能帮助我们找到内存泄漏的根源,通过查看支配树、计算DOM大小、查找可疑的大对象等特性,...

    heapdump分析工具

    当遇到应用程序运行缓慢,频繁出现Full GC,甚至出现OutOfMemoryError等问题时,我们通常需要对堆内存进行深入分析,这就是heapdump工具的作用所在。heapdump工具可以帮助开发者诊断Java应用的内存泄漏、过度对象...

    MAT java memory 分析 内存分析

    MAT(Memory Analyzer Tool)是Eclipse基金会开发的一款强大的Java内存分析工具,主要用于诊断Java应用程序的内存泄漏和性能问题。在Java应用中,内存泄漏通常是因为某些对象被长时间保留在全局数据结构,如HashMap...

    JVM Full GC 之 MAT工具分析实践-阿沐1

    MAT(Memory Analyzer Tools)作为一款强大的内存分析工具,可以帮助我们定位内存泄漏,优化内存使用。 MAT的使用场景主要集中在两个方面:一是出现OutOfMemoryError,此时Full GC无法回收足够的内存,可能表明存在...

    java内存泄露、溢出检查方法和工具

    从提供的`MemoryAnalyzer-1.2.1.20121105-win32.win32.x86.zip`文件中解压并运行MAT,然后导入刚才生成的`heapdump.hprof`文件。 3. **分析内存泄漏**:MAT提供多种视图来帮助定位问题,其中饼状图是最直观的一种。...

    内存泄露方面分析文档

    这些流程包括使用IBM提供的内存分析工具,如Memory Analyzer Tool (MAT),以及通过命令行工具如jmap来获取内存转储(heap dump)和运行时内存使用的快照。分析工具可以帮助开发者识别内存中对象的保留树(Retained ...

    jvm工具、参数调优&调试技巧.doc

    5. **jmap(Memory Map for Java)**:它可以导出堆内存快照,供其他工具如jhat或MAT进行分析,也可以获取垃圾收集器和堆内存的详细信息。 6. **jstack(Java Thread Stack Trace)**:提供Java线程堆栈信息,用于...

    宕机、高cpu、慢sql等问题辅助工具v0.1.pdf

    - **工具简介**: MAT (Memory Analyzer Tool) 是一款强大的内存分析工具,能够帮助开发者分析Java程序的内存使用情况。 - **使用方法**: - 下载并安装MAT。 - 打开MAT工具并加载生成的heapdump文件。 - 分析内存...

    Java常见问题排查

    - **分析Heap Dump文件:** 使用工具如MAT (Memory Analyzer Tool) 的Dominator Tree视图来查找内存占用最高的对象。 - **代码层面分析:** 如果存在内存泄漏或其他内存使用不当的情况,可以使用BTrace等工具进行...

    Java宝典(第一版)

    - **Java诊断工具**:例如Eclipse Memory Analyzer (MAT)可以帮助分析Java应用程序的内存使用情况;VisualVM提供了一个用户友好的界面来监控和调试JVM运行的应用程序。 - 通过编写特定类型的异常程序(如...

    Java核心技术大全

    - Eclipse Memory Analyzer (MAT) 是一款强大的Java内存分析工具,能够帮助开发者识别和解决内存泄漏等问题。 - VisualVM 是另一款强大的工具,它提供了一个统一的界面来监控和故障排查运行中的Java应用程序。特别是...

Global site tag (gtag.js) - Google Analytics