日期:2014-05-16  浏览次数:20353 次

关于IE下的内存回收研究.
有很多人提到IE下使用AJAX内存会增长很快.

我稍微研究了一下   发现其实IE的并不会主动的对未引用的变量进行回收
CollectGarbage()只是对值为null的变量进行回收,其实就算不用CollectGarbage()在下次分配内存的时候IE也会对null的内存进行重新分配.

例如一个有类   class1
function   class1()
{
this.a   =   "xxxx ";
this.b   =   "xxxx ";
this.c   =   "xxxx ";
this.d   =   "xxxx ";
}

var   aa   =   new   class1();
aa   =   null;
这样被释放的内存也只有aa这个变量.  
class1的实例的所有成员的内存完全没有被释放,这些内存将在IE最小化的时候才会被废弃.

也就是说我们需要手动的对这些内存进行释放.
var   aa   =   new   class1();
for(o   in   aa)aa[o]=null;
aa   =   null;
这样就可以完全把class1的内存释放掉

但如果class1里面还有一个类的实例
function   class1()
{
this.a   =   "xxxx ";
this.b   =   "xxxx ";
this.c   =   "xxxx ";
this.d   =   new   class2();
}
function   class2()
{
this.a   =   "xxxx ";
this.b   =   "xxxx ";
this.c   =   "xxxx ";
this.d   =   "xxxx ";
}

var   aa   =   new   class1();
for(o   in   aa)aa[o]=null;
aa   =   null;

同理这样释放内存的话   class1里面的class2的内存就没有被释放
至于怎么释放我就不多说了

对于document.createElement()方法
其实就相当于是一个新的DHTMLElement实例   稍微估算了一下一般是8K一个

以下是重点
IE在移除一个HTML元素时   只是对所有属性进行了回收   而所有的事件完全没有被回收
而这些事件方法往往是内存占用的大鳄.通常导致DHTML元素8K的内存完全没有被回收

例如:
function   class1()
{
this.a   =   "xxxx ";
this.b   =   "xxxx ";
this.c   =   "xxxx ";
this.d   =   "xxxx ";
this.e   =   document.createElement( "div ");
this.e.onclick   =   function(){.....;}
this.e.ondblclick   =   function(){.....;}
}

var   aa   =   new   class1();
for(o   in   aa)aa[o]=null;
aa   =   null;

这样的话就平白无故的多了8K无法回收的内存

对于上面的情况我们需要这样   才能回收

var   aa   =   new   class1();
aa.e.onclick   =   null;
aa.e.ondblclick   =   null;
for(o   in   aa)aa[o]=null;
aa   =   null;

当然也有个通用的回收方法   效率很低而已
var   aa   =   new   class1();
for(o   in   aa.e)
        if(o.indexOf( "on ")==0)
                aa.e[o]=null;
for(o   in   aa)
        aa[o]=null;
aa   =   null;

总结以上   IE的内存不会被自动回收   但不是不能被回收
怎么回收   那就要靠你自己动手来写了

------解决方案--------------------
5-1,还搞研究,佩服,我只接分
------解决方案--------------------
mark
------解决方案--------------------
mark
------解决方案--------------------
受教ed
------解决方案--------------------
mark...
------解决方案--------------------
俺 5.1 写了CMS系统的好几个模块...
唉...
------解决方案--------------------
学习