当前位置 > 首页 > 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)