`

(转)使用 Eclipse Memory Analyzer 检测内存泄漏问题

 
阅读更多

本文是关于在开发 Talend RCP 过程中碰到一个内存溢出问题的解决方案。使用的检测软件为 Eclipse Memory Analyzer (http://www.eclipse.org/mat/ ) ,是一个开源免费的内存分析工具,目前为 eclipse 的孵化项目,也是一个 eclipse RCP.

Talend 一款开源的 ETL 软件,提供数据集成服务。基于 eclipse RCP EMF, GEF JET 等技术开发。

 

Talend 软件系统中,一个 designer editor 是一个 mulit page editor, 它的实例是 MultiPageTalendEditor ,其中包含两页,第一页是一个 gef Editor ,用来显示 GEF 图形;第二页是一个 JavaEditor, 用来显示生成的代码。如下两图所示:

 

 

 

 

 

 

    经过其他工具的测试发现 JavaEditor 如果用在 mulit page editor 中,关闭后,起实例无法回收,造成内存泄漏,因为 Editor 是一个非常频繁使用的功能项,所以该问题非常严重。

 

 

要使用 Eclipse Memory Analyzer ,首先要生成 dump 文件。

eclipse 中配置 Preferences -> Java -> Installed JREs, 定义 Jdk1.6 来运行 Talend.

Talend 运行后,执行一下打开 editor 的操作,在将 editor 关闭,这样虚拟机中保存了相应的堆栈信息。其实也就是执行一下你认为会产生内存泄漏的操作。

 

运行 jdk1.6 bin 目录下的 jconsole.exe ,运行后如下图所示,选择连接到运行的 Talend

 

  

 

 

 

选择 Mbean -> com.sun.management -> HotSpotDiagnos -> Operations -> dumpHeap

在参数 p0 中填写保存 dump 文件的路径,例如 f:/my.hprof, 文件的后缀名要为 hprof

点击 dumpHeap 按钮生成 dump 文件。

 

 

 

 

 

打开 Eclipse Memory Analyzer, 在菜单 File 下,选择打开刚才生成的 dump 文件。如下图:

 

 

 

 

 

 

在第一行的 filter 中填写需要检查的类名,这里我要检查的类为 TalendJavaEditor 。在如下图所示的上下文菜单中选择 List objects -> with incoming references, 查看保存了 TalendJavaEditor 实例的引用。

 

 

 

 

 

 

在如下图所示的上下文菜单中选择 Path To GC Roots -> exclude weak/soft references, 过滤掉弱引用,因为在这里弱引用不是引起问题的关键。

 

 

 

 

 

 

从下图中,可以看到 JavaInfomationProvider 中保存了 TalendJavaEditor 的引用。所以打开 JavaInfomationProvider 的代码,进行检查。从下图的分析中,大概可以看出这是一个注册了的监听器没有反注册的问题,这也是引起内存泄露的原因中最常见的。

 

 

 

 

 

public JavaInformationProvider (IEditorPart editor ) {

 

       fEditor = editor;

 

       if ( fEditor != null ) {

 

           fPartListener = new EditorWatcher ();

           IWorkbenchWindow window = fEditor .getSite ().getWorkbenchWindow ();

           window.getPartService ().addPartListener ( fPartListener );

 

           update ();

       }

    }

 

JavaInformationProvider 的构造方法中,保存了 TalendJavaEditor 的实例,并且注册了监听器。

 

 

 

 

public void partClosed (IWorkbenchPart part ) {

           if (part == fEditor ) {

               fEditor .getSite ().getWorkbenchWindow ().getPartService ().removePartListener ( fPartListener );

              fPartListener = null ;

           }

       }

 

 

EditorWatcher 的方法 partClosed 中,当关闭一个 designer editor 的时候,传进来的 part MultiPageTalendEditor ,而不是 JavaInformationProvider 保存的 TalendJavaEditor ,所以该 listener 永远不可能被反注册掉, GC 也就不可能回收 TalendJavaEditor 。对于该软件系统来所,这是一个致命的内存溢出问题。

 

 

转自:http://blog.csdn.net/moneyice/article/details/2644503

分享到:
评论

相关推荐

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

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

    java堆内存分析工具EclipseMemoryAnalyzer

    1、MemoryAnalyzer使用说明文档/使用指南 2、MemoryAnalyzer 1.8.1下载: Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来...

    Eclipse Memory Analyzer中文使用说明(带书签)

    点到 Y 的所有路径都必须经过 X。➢根对象(root objects...通过深入理解和熟练运用这些知识点,你可以有效地利用 Eclipse Memory Analyzer 工具,诊断和解决 Java 应用程序中的内存泄漏问题,提高系统的稳定性和性能。

    Eclipse Memory Analyzer1.8.1&安装使用指南

    Eclipse Memory Analyzer,通常简称为MAT(Memory Analyzer Tool),是一款由Eclipse基金会开发的强大内存分析工具,主要用于诊断Java应用程序的内存泄漏和优化内存使用。它提供了深入的heap dump分析,帮助开发者...

    Eclipse Memory Analyzer 中文文档

    《Eclipse Memory Analyzer》中文文档是一份详尽的指南,主要针对Java开发人员,特别是那些在处理内存管理和优化方面遇到挑战的开发者。这份文档共有93页,旨在帮助用户理解和利用MAT (Memory Analyzer Tool)有效地...

    Eclipse Memory Analyzer1.8.1&安装使用指南.zip

    Eclipse Memory Analyzer(MAT)是一款强大的Java内存分析工具,它被广泛用于诊断和解决Java应用程序中的内存泄漏问题。MAT 1.8.1是适用于macOS的特定版本,旨在帮助开发者深入理解并优化他们的Java应用内存使用情况...

    Eclipse Memory Analyzer (Mac版)

    Eclipse Memory Analyzer(MAT,全称Memory Analyzer Tool)是一款强大的Java内存分析工具,尤其在Mac平台上,它提供了独立于Eclipse环境的版本,方便开发者直接使用。MAT的主要目标是帮助开发者诊断和解决Java应用...

    Eclipse--Memory-Analyzer中文教程

    Eclipse Memory Analyzer(内存分析器)是一款专门为Java堆内存分析而设计的工具,它可以协助开发者快速地分析内存泄漏问题,通过生成的报告指出潜在的内存泄漏可疑点。Memory Analyzer可以单独使用,也可以作为...

    EclipseMemoryAnalyzer-x86_64

    标题“EclipseMemoryAnalyzer-x86_64”表明这是一款针对x86_64(64位)架构的Eclipse Memory Analyzer工具。这通常意味着该版本可以运行在64位的操作系统上,例如Windows、Linux或macOS。同时,“MemoryAnalyzer-1.7...

    堆dump分析工具Eclipse Memory Analyzer

    总之,Eclipse Memory Analyzer是Java开发者诊断内存问题不可或缺的工具,它通过丰富的视图和报告,使复杂的内存分析变得直观易懂,帮助开发者优化内存管理,提高应用的稳定性和性能。通过熟练掌握MAT,开发者可以...

    mat内存分析工具单独软件无需安装-Eclipse Memory Analyzer Version 1.7.0.rar

    MAT(Memory Analyzer Tool)是Eclipse项目开发的一款强大的Java内存分析工具,主要用于诊断Java应用程序的内存泄漏和性能问题。在标题中提到的“Eclipse Memory Analyzer Version 1.7.0.rar”是一个压缩包,其中...

    Eclipse Memory Analyzer内存映像分析工具

    Eclipse Memory Analyzer(MAT)是一款强大的Java虚拟机(JVM)内存分析工具,它能够帮助开发者定位并解决Java应用程序中的内存泄漏问题。MAT通过解析.hprof文件,即Java虚拟机生成的内存快照,来展示堆内存的详细...

    EclipseMemoryAnalyzer使用教程.rar

    Eclipse Memory Analyzer(MAT)是Eclipse基金会提供的一款强大的Java内存分析工具,它主要用于诊断Java应用程序的内存泄漏问题。MAT通过分析heap dump文件,能够帮助开发者深入理解内存消耗的细节,找出内存占用过...

    memory analyzer 内存泄露

    本文将围绕"MemoryAnalyzer"这个内存泄露检测工具,以及如何在Tomcat和JVM环境中进行内存泄露检测进行深入探讨。 MemoryAnalyzer,通常简称为MAT,是由Eclipse基金会开发的一款强大的Java堆内存分析工具。它能帮助...

    MAT(Memory Analyzer Tool)内存分析工具的安装与使用

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

    使用 Eclipse Memory Analyzer 进行堆转储文件分析_files

    Eclipse Memory Analyzer(MAT)是一款强大的Java内存分析工具,它能帮助开发者诊断和解决与内存泄漏、内存占用过高以及垃圾收集性能问题相关的问题。在Java应用程序中,如果内存管理不当,可能会导致系统运行缓慢,...

    Eclipse memory analyzer

    总之,Eclipse Memory Analyzer是Java开发者不可或缺的工具,它提供了深入的内存分析功能,帮助优化应用程序性能,预防和解决内存泄漏问题。熟练掌握MAT的使用,对于提升Java应用的稳定性和效率具有重大意义。

    MemoryAnalyzer-1.7.0.201706130745.zip

    MemoryAnalyzer,简称MAT,是一款由Eclipse基金会开发的专业内存分析工具,其版本号为1.7.0.201706130745,主要用于Java应用程序的内存泄漏检测和性能优化。该软件的核心功能在于帮助开发者找出程序运行过程中可能...

    MemoryAnalyzer-1.12.0.20210602-win32.win32.x86-64.zip

    资源名称:Eclipse MemoryAnalyzer,MAT(Memory Analyzer Tool) 文件名称:MemoryAnalyzer-1.12.0.20210602-win32.win32.x86_64.zip 描述: Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您...

Global site tag (gtag.js) - Google Analytics