本文是关于在开发
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 (MAT) 工具来诊断并解决 Tomcat 服务器上的 Java 应用程序内存溢出问题。 #### 二、内存溢出的原因及处理思路 ##### 2.1 内存泄露 - **定义**:内存泄露是指不再...
1、MemoryAnalyzer使用说明文档/使用指南 2、MemoryAnalyzer 1.8.1下载: Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来...
点到 Y 的所有路径都必须经过 X。➢根对象(root objects...通过深入理解和熟练运用这些知识点,你可以有效地利用 Eclipse Memory Analyzer 工具,诊断和解决 Java 应用程序中的内存泄漏问题,提高系统的稳定性和性能。
Eclipse Memory Analyzer,通常简称为MAT(Memory Analyzer Tool),是一款由Eclipse基金会开发的强大内存分析工具,主要用于诊断Java应用程序的内存泄漏和优化内存使用。它提供了深入的heap dump分析,帮助开发者...
《Eclipse Memory Analyzer》中文文档是一份详尽的指南,主要针对Java开发人员,特别是那些在处理内存管理和优化方面遇到挑战的开发者。这份文档共有93页,旨在帮助用户理解和利用MAT (Memory Analyzer Tool)有效地...
Eclipse Memory Analyzer(MAT)是一款强大的Java内存分析工具,它被广泛用于诊断和解决Java应用程序中的内存泄漏问题。MAT 1.8.1是适用于macOS的特定版本,旨在帮助开发者深入理解并优化他们的Java应用内存使用情况...
Eclipse Memory Analyzer(MAT,全称Memory Analyzer Tool)是一款强大的Java内存分析工具,尤其在Mac平台上,它提供了独立于Eclipse环境的版本,方便开发者直接使用。MAT的主要目标是帮助开发者诊断和解决Java应用...
Eclipse Memory Analyzer(内存分析器)是一款专门为Java堆内存分析而设计的工具,它可以协助开发者快速地分析内存泄漏问题,通过生成的报告指出潜在的内存泄漏可疑点。Memory Analyzer可以单独使用,也可以作为...
标题“EclipseMemoryAnalyzer-x86_64”表明这是一款针对x86_64(64位)架构的Eclipse Memory Analyzer工具。这通常意味着该版本可以运行在64位的操作系统上,例如Windows、Linux或macOS。同时,“MemoryAnalyzer-1.7...
总之,Eclipse Memory Analyzer是Java开发者诊断内存问题不可或缺的工具,它通过丰富的视图和报告,使复杂的内存分析变得直观易懂,帮助开发者优化内存管理,提高应用的稳定性和性能。通过熟练掌握MAT,开发者可以...
MAT(Memory Analyzer Tool)是Eclipse项目开发的一款强大的Java内存分析工具,主要用于诊断Java应用程序的内存泄漏和性能问题。在标题中提到的“Eclipse Memory Analyzer Version 1.7.0.rar”是一个压缩包,其中...
Eclipse Memory Analyzer(MAT)是一款强大的Java虚拟机(JVM)内存分析工具,它能够帮助开发者定位并解决Java应用程序中的内存泄漏问题。MAT通过解析.hprof文件,即Java虚拟机生成的内存快照,来展示堆内存的详细...
Eclipse Memory Analyzer(MAT)是Eclipse基金会提供的一款强大的Java内存分析工具,它主要用于诊断Java应用程序的内存泄漏问题。MAT通过分析heap dump文件,能够帮助开发者深入理解内存消耗的细节,找出内存占用过...
本文将围绕"MemoryAnalyzer"这个内存泄露检测工具,以及如何在Tomcat和JVM环境中进行内存泄露检测进行深入探讨。 MemoryAnalyzer,通常简称为MAT,是由Eclipse基金会开发的一款强大的Java堆内存分析工具。它能帮助...
MAT是分析Java堆内存的一个工具,全称是 The Eclipse ...MAT 软件版本解压后目录内有个MemoryAnalyzer.ini文件,该文件里面有个Xmx参数,该参数表示最大内存占用量,默认为1024m,根据堆转储文件大小修改该参数即可。
Eclipse Memory Analyzer(MAT)是一款强大的Java内存分析工具,它能帮助开发者诊断和解决与内存泄漏、内存占用过高以及垃圾收集性能问题相关的问题。在Java应用程序中,如果内存管理不当,可能会导致系统运行缓慢,...
总之,Eclipse Memory Analyzer是Java开发者不可或缺的工具,它提供了深入的内存分析功能,帮助优化应用程序性能,预防和解决内存泄漏问题。熟练掌握MAT的使用,对于提升Java应用的稳定性和效率具有重大意义。
资源名称:Eclipse MemoryAnalyzer,MAT(Memory Analyzer Tool) 文件名称:MemoryAnalyzer-1.12.0.20210602-win32.win32.x86_64.zip 描述: Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您...
本文将深入探讨MemoryAnalyzer的使用方法,帮助开发者掌握其核心功能,解决常见的内存泄漏和性能问题。 1. **MemoryAnalyzer简介** MemoryAnalyzer,通常简称为MAT,是一款基于Eclipse平台的免费开源工具,专门...