在某个Ajax项目中使用到了
Adobe Spry框架。
在项目部署测试中,发现有内存泄露。仔细检查了所有的代码,发现该注意的地方都已经清理过,一时找不到原因。最后突发奇想是不是用到的Spry框架的问题?用测试工具详细分析后表明,Spry的MenuBar组件在IE6下有内存泄露。晕,让Adobe的名号害惨了项目组的同志们,即使最新的1.6.1版本也不例外。最后分析代码表明,这还是那个IE6JS引擎与DOM引擎相互分离的
老BUG了,当dom元素绑定到的事件响应函数引用到自身的时候。在page unload的时候,该元素就会成为孤儿,它占用的内存就不会被系统所回收。
经过测试,这个全局的菜单每次会有56个泄露的节点,占用内存200k左右。当页面浏览次数增加时,甚至会有数十M的内存泄露!
找到了问题的所在,那么解决起来就很容易了。hack部分代码,解决内存泄露。项目顺利验收...
在注册事件响应时,把匿名函数绑定在该元素上
Spry.Widget.MenuBar.prototype.addEventListener = function(element, eventType, handler, capture)
{
try
{
if (element.addEventListener)
{
element.addEventListener(eventType, handler, capture);
}
else if (element.attachEvent) //IE6 needs more to handle memory
{
element.attachEvent('on' + eventType, handler);
if(!element._handlers) element._handlers = [];
element._handlers['on' + eventType] = handler;
}
}
catch (e) {}
}
增加一个clearLeak方法,在onload事件中清除这些绑定。
Spry.Widget.MenuBar.clearLeak = function(menu)
{
if(!Spry.is.ie)return;
alert('reged with' + menu.element.id);
window.attachEvent('onunload', function(){
//alert('recycling...');
var recycler = document.createElement('div');
var element = menu.element;
loopLeak(element);
function loopLeak(object)
{
var children = object.childNodes;
if(children.length > 0)
{
for(var i in children)
{
var child = children[i];
if(child && child.nodeType == 1)loopLeak(child);
}
}
if(object && object._handlers)
{
for(var index in object._handlers)
{
var handler = object._handlers[index];
object.detachEvent(index, handler);
}
var a = object.attributes, i, l, n;
if (a) {
l = a.length;
for (i = 0; i < l; i += 1) {
n = a[i].name;
if (typeof object[n] === 'function') {
object[n] = null;
}
}
}
object._handlers = null;
}
}
//alert('recycling...done');
element = null;
});
}
最后在构造方法中,绑定menubar实例与清除函数。完成。
Spry.Widget.MenuBar.prototype.init = function(element, opts)
{
//...ommitted
if(Spry.is.ie)
{
//...
Spry.Widget.MenuBar.clearLeak(this);
}
}
};
参考文章:
JScript Memory Leaks
Understanding and Solving Internet Explorer Leak Patterns
Closures and IE Circular References
分享到:
相关推荐
This program is a tool that help you positioning memory leak locations of an QUALCOMM BREW application on simulator. It can give the call stack of memory leaks (including the locations that MALLOC/...
内存泄漏是程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能看似无足轻重,但随着时间推移,大量的内存泄漏会消耗掉系统可用内存,导致性能下降甚至系统崩溃。在C++编程中,由于手动管理内存的...
**BREW Memory Leak Checker** 是一个专为BREW(Binary Runtime Environment for Wireless)平台设计的工具,用于检测和定位BREW应用程序中的内存泄漏问题。在移动设备开发中,内存管理是至关重要的,因为有限的资源...
本文将深入探讨C++中的内存泄漏问题及其解决策略,并介绍两种常用的内存泄漏检测工具——Visual Leak Detector (VLD) 和 CodeSnitch。 内存泄漏的发生通常是由于以下原因: 1. 动态分配的内存未被释放:当使用`new`...
This program is a tool that help you positioning memory leak locations of an QUALCOMM BREW application on simulator. It can give the call stack of memory leaks (including the locations that MALLOC/...
BREW Memory Leak Checker是一款专为BREW(Binary Runtime Environment for Wireless)平台设计的内存泄漏检测工具,版本号为20111030。该工具的主要功能是在BREW模拟器上帮助开发者定位并解决应用程序中的内存泄漏...
BREW Memory Leak Checker是一款专为BREW(Binary Runtime Environment for Wireless)平台设计的内存泄漏检测工具,版本号为20111109。该工具的主要功能是在BREW模拟器上帮助开发者定位并解决应用程序中的内存泄漏...
在C++编程中,内存泄漏是一个常见的问题,它发生在程序员分配了内存但未能正确地释放。这可能导致程序占用越来越多的内存,最终导致性能下降甚至崩溃。为了帮助开发者检测和修复内存泄漏,本压缩包提供了一个内存...
Glassfish 3.1.2.2 Web Service Memory Leak Workaround Glassfish 3.1.2.2 中的 Memory Leak 问题可能会导致服务器变慢或无响应。这种问题可能是由于 Web Service 的 Memory Leak 导致的。在此文中,我们将讨论...
JavaScript是一种广泛应用于Web开发的脚本语言,它在执行时占据内存资源,如果代码编写不当,可能会出现“内存泄漏”(Memory Leak)的问题。内存泄漏是程序运行时未释放不再使用的内存,导致系统资源浪费,严重时...
Memory Leak(解决方案).md
使用内存分析工具,如Chrome DevTools或Firefox的Memory Profiler,可以帮助识别内存泄漏的模式和具体对象。这些工具可以显示内存分配和引用关系,帮助开发者找到难以察觉的内存泄漏点。 总的来说,AngularJS在IE8...
Memory Leak Detected(亲测可用).md
"Android中Memory Leak原因分析及解决办法" Android中Memory Leak原因分析及解决办法是Android开发过程中的重要问题之一。Memory Leak是指在Android应用程序中,一些对象不能被正确释放,导致这些对象继续占用内存...
编译器设计之代码分析工具:Memory Leak Detectors
1. `_CrtSetDbgFlag`: 这个函数允许我们设置调试标志,其中`_CRTDBG_LEAK_CHECK_DF`是用于开启内存泄漏检查的标志。通过在程序启动时调用`_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF)`,我们可以让程序在退出时报告内存...
内存泄漏检测器 MemoryLeakDetector是由Xigua视频android团队开发的本地内存泄漏监视工具。 它具有访问简单,监视范围广,性能...leak-detector:0.0.7 '} 步骤3:添加代码以方便使用(使用广播控件不需要此步骤) //
"Visual C++ Memory Leak Detector"就是针对这类问题的工具,它可以帮助开发者检测和定位C++程序中的内存泄漏。 该压缩包文件包含了一个名为"vld-1.9d-setup.exe"的安装程序,这很可能是Visual Leak Detector (VLD)...