IE内存泄漏(2)

以前因为没有做过比较大型的应用,所以也一直没注意这些。最近的一个项目里需要频繁的创建和清除一批对象,导致IE占用的实际内存和虚拟内存急剧上升,而且最小化IE窗口或关闭窗口也不会释放。搜索了一下关于IE内存泄漏的文章,其中birdshome上的这一系列文章讲的比较全面,引起IE内存泄漏的主要情况为js对象实例跟dom对象的相互引用、“内部函数引用(Closures)”以及DOM插入顺序泄漏。

以前为了方便,在涉及操作dom对象的地方,通常建立一个对dom对象的引用,dom对象也建立一个指向js对象实例的引用,例如:
function myObject()
{
this.element = document.getElementById(’myElement’);
document.getElementById(’myElement’).instance = this;
}

var obj = new myObject();

这样不管js调用dom还是从dom反向找到实例都非常方便,但如果在对象销毁或document unload的时候不去解除他们之间的引用,就会引起内存泄漏。所以应该尽量避免这种写法,通过在对象中指定dom对象的id或者其他方式来建立js对象跟dom对象的关联。

所谓“)“,内部函数引用(Closures)“,这里有详细的解释。而对于dom插入顺序泄漏这个就很难让人理解了,只能尽量遵循这个规则。

关于内存回收,同样引用birdshome上对于bindows对象dispose方法的解释:切断DHTML对象实例和脚本对象实例的引用链;清除全局cache变量中的数据,使用delete关键字;使用attachEvent方式导入的事件处理函数,需要detach;其它事件处理回调,使用赋null的方式清空;切断脚本对象之间的parent或child关系引用链。

还有就是尽量不要使用IE透明滤镜,我发现当插入一个长宽各为1000px并应用透明滤镜的div时,内存占用增加大约4MB。

相关文章

随机推荐:

相关链接

helloajax.com
专注Ajax、Asp.Net、JavaScript技术