<!–markdown–>契机
近日,手头上负责的一个项目被报告在IE下会产生严重的内存泄露,在对某一复杂表单进行若干次操作后(大约十次左右)IE进程的内存占用就达到了600M之多,恐怖之极。
过程
由于泄露页面表单中使用了extjs,第一时间怀疑是否是extjs代码内存没有及时释放。但是这个设想很快就被我否定了,因为我发现在发生泄露后不管我怎么跳转页面、重登,甚至关闭ie,进程还是占用着内存。
基于IE的CollectGarbage机制,我们知道,当对象不在他当前上下文的时候,即会失效。
<p><!–more–></p>
本着70%的问题别人都是已经碰到过的原则,我找到了神奇海螺。最后我发现,<font color='red'>IE并没有办法正确的释放iframe所占用的内存</font>,一旦碰到这种iframe里藏着个怪兽的情况下。内存泄露将会非常严重。
解决方案
手工释放iframe的内存。
iframe_child=obj.getElementsByTagName('iframe')[0];
//清空iframe 减轻ie下内存泄露
if(iframe_child){
iframe_child.src='about:blank';
iframe_child.contentWindow.document.write('');
iframe_child.contentWindow.document.clear();
iframe_child.contentWindow.document.close();
iframe_child.removeNode(true);
}
setTimeout(function(){
obj.wintitle.removeNode(true) ;
obj.removeNode(true) ;
obj = null;
},200);
if(CollectGarbage){//IE强制回收内存
CollectGarbage();
}