当前位置 > 首页 > IE9\IE8

IE9 关联数组导致内存泄漏

2012-8-23 13:13:00来源:IE9\IE8

最近为了满足一部分朋友的需求,给 zTree 提供了 destroy 的方法,用于让 zTree 自行清空。为了检查该方法是否有效,做了一个简单的测试——显示5000个节点然后清空,此操作循环100次,结果发现 IE9 下内存严重暴涨,于是进行了反复筛查,最终锁定了嫌疑犯:关联数组(data[key] = value)导致的内存泄漏!

只找到了嫌疑犯不行,定罪要有证据的,设计了一个简单的模型专门进行这个情况的测试,不排除可能由于我的疏忽得到的错误的结论,因此非常欢迎大家踊跃发表自己的看法,随便喷吧。。。。

【测试模型】

不要 DOM 和闭包、匿名函数干扰,一个全局变量 data 用于保存生成的数据;一个全局变量max用于设置数据最大条数;一个Function用于创建数据;一个Function 用于销毁数据。两个按钮,分别用于触发这两个Function。

补充:为了进行多种情况对比,因此一共制作了8组创建数据、销毁数据的 Function ,详细见后面的说明。

【测试流程】


【测试环境】

Win7 64位操作系统;IE Tester下的 IE6、8、9;FireFox v14.0.1;Chrome v21.0.1180.79;IE6性能太差,因此设置数据条数 max=100000;其他的浏览器都设置 max=1000000;

【开始测试】

1) 第一组测试:

创建对象:关联数组的 key 值无限递增,绝不重复

销毁对象:递归遍历对象内部属性,逐一清空

var data = new Object();
var i=0,j, max=1000000;

function initJson_1(){
	for (j=i+max; i<j; i++) {
		data["_" + i] = {id:i, name:"name" + i};
	}
}

function clearJson_1(){
	clearItem(data);
}

function clearItem(jsonObj) {
	for (var s in jsonObj) {
		var obj = jsonObj[s];
		if (obj instanceof Array) {
			for(var i=obj.length-1; i>=0; i--) {
				clearItem(obj[i]);
				obj.pop();
			}
		}else if (obj instanceof Object){
			clearItem(obj)
		}else{
		}
		jsonObj[s] = null;
		delete jsonObj[s];
	}
	jsonObj = null;
}

测试结果: 

 

测试分析:

这种递归逐一清空对象属性的方法对于 IE6 和 Chrome 有一定效果,FireFox杯具了直接无响应(缩小max值后可以正常);IE8内存暴涨,貌似与这个清空的方法有关,第三次之后再执行方法就无反应了;IE9内存稳步上升,即使最后刷新页面也仍然占有大量内存。

2)


  • IE9无法输入滚轮失效的进来看看

    2011-3-21 11:47:00

    我的IE默认网址设的hao123,经常出现网页内无法输入和滚轮失效的情况,这几天试了多种方法都没结果(不想关闭UAC)。 今天早上,我把hao123关闭后情况却大为好转,有几个小时没有出问题了,大

  • IE开发者工具中的两个模式是如何选取的?

    2011-3-26 20:26:00

    最近下了IE9正式版,打开我自己用notepad写的一个很简单的html页之后,我发现页面中竟然显示canvas标签无法识别。 我原来用过IE9的beta和rc版,一直都可以正常识别的。后来我发

  • GVOD在ie9无法播放??

    2011-3-24 0:59:00

    GVOD在ie9里面 播放框都无法出现啊 ? QVOD倒是什么问题都没有 反而解决了ie8下面页面缩放以后画面不正常的问题了 不知道大家也是这样么

  • IE 9 Druckt nur schwarze Balken statt Liste!

    2011-9-28 18:03:00

    Guten Tag, ich habe ein Problem, bei mir bei der Arbeit, von unserer Homepage auf dem Internet Ex

  • 求救!IE8 中FrameSet嵌套的问题

    2011-3-19 17:58:00

    各位路过的知情人,请帮忙解决以下吧 不知道怎么回事,IE8 做frameset 嵌套的时候会出现问题,在IE7 IE6中都是正常的 问题 1、在resize frame2和frame4 的时候

  • 我的ie9很奇怪

    2011-3-25 10:40:00

    原来打开两个以上页面时,点右上角X关闭ie时会出现询问十全关闭还是只关闭当前页,现在一点,不管有几个页面ie全部关闭了,真奇怪呀!谁知道怎么回事?

  • VS2010开发环境下用IE浏览网站打不开

    2012-5-28 10:47:00

    请问:VS2010开发环境下用IE浏览网站,在第一次浏览的时候要等非常长的时间,直到ie出现“Internet Explorer 无法显示该网页”,然后再地址栏中按一下回车键立马就能

  • IE9农行网银无法使用

    2011-3-20 20:30:00

    在用农行网银的时候要求输入密码,输进去的都是对的(肯定是对的),但是到后面总是提醒我密码输错了,还害得我把卡给锁了,不给力啊!求教有解决的方法没

  • IE9无法支持PAC代理自动配置脚本?

    2011-4-14 20:01:00

    由IE8升级为IE9后,发现IE9法支持PAC代理自动配置脚本,只好回退到IE8,为什么? 难道是IE9的PAC脚本与IE8 不同?PS:OS为WIN7

  • IE9正式版在js中调用appendChild时的问题

    2011-3-19 17:58:00

    页面test1.html <HTML> <HEAD><TITLE></TITLE> </HEAD> <body> &