fighting with IE memory leak

在某个Ajax项目中使用到了[url="http://labs.adobe.com/technologies/spry/"]Adobe Spry[/url]框架。

在项目部署测试中,发现有内存泄露。仔细检查了所有的代码,发现该注意的地方都已经清理过,一时找不到原因。最后突发奇想是不是用到的Spry框架的问题?用测试工具详细分析后表明,Spry的MenuBar组件在IE6下有内存泄露。晕,让Adobe的名号害惨了项目组的同志们,即使最新的1.6.1版本也不例外。最后分析代码表明,这还是那个IE6JS引擎与DOM引擎相互分离的[url="http://msdn2.microsoft.com/en-us/library/bb250448(VS.85).aspx"]老BUG[/url]了,当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);
}
}
};


参考文章:
[url=http://javascript.crockford.com/memory/leak.html]JScript Memory Leaks[/url]
[url=http://msdn2.microsoft.com/en-us/library/bb250448(VS.85).aspx]Understanding and Solving Internet Explorer Leak Patterns[/url]
[url=http://siteexperts.spaces.live.com/Blog/cns!1pNcL8JwTfkkjv4gg6LkVCpw!338.entry]Closures and IE Circular References[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值