`

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

MAT 
阅读更多

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

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

 

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的时候,传进来的partMultiPageTalendEditor,而不是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中文使用说明(带书签)

    - 除了 Memory Analyzer,还有其他内存分析工具,如 JProfiler、VisualVM 等,它们也可以帮助诊断和解决 Java 内存问题。 通过深入理解和熟练运用这些知识点,你可以有效地利用 Eclipse Memory Analyzer 工具,...

    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内存映像分析工具

    打开MAT非常简单,只需将下载并解压后的MAT文件夹中的"MemoryAnalyzer.exe"双击启动。一旦程序运行,你可以直接将生成的.hprof文件拖放到MAT界面,工具会自动读取并分析文件内容。亲测这种方法是可行的,确保了工具...

    EclipseMemoryAnalyzer使用教程.rar

    总的来说,Eclipse Memory Analyzer是一款强大的工具,它能帮助Java开发者深入剖析内存问题,找出潜在的内存泄漏,提高应用性能。熟练掌握MAT的使用,对于任何Java开发者的技能提升都至关重要。通过不断实践和学习,...

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

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

    memory analyzer 内存泄露

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

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

    通过以上步骤,我们可以有效地使用Eclipse Memory Analyzer分析JMAP生成的堆转储文件,找出并解决Java应用程序中的内存问题。记住,内存分析是一个持续的过程,需要定期检查和优化,以确保应用程序的高效运行。

    Eclipse memory analyzer

    Eclipse Memory Analyzer(EMA),通常被称为MAT(Memory Analyzer Tool),是一款强大的Java堆内存分析工具,由Eclipse基金会开发。这款工具对于诊断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堆分析器,可帮助您...

    MemoryAnalyzer 使用中文

    为了帮助开发者更好地理解和诊断内存问题,Eclipse社区开发了一款强大的工具——MemoryAnalyzer(MAT),它是一款专业的Java内存分析工具。本文将深入探讨MemoryAnalyzer的使用方法,帮助开发者掌握其核心功能,解决...

Global site tag (gtag.js) - Google Analytics