关于IE下的内存回收研究.

gzdiablo 2007-05-01 09:53:16
有很多人提到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的内存不会被自动回收 但不是不能被回收
怎么回收 那就要靠你自己动手来写了
...全文
1990 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
antony1029 2010-04-14
  • 打赏
  • 举报
回复
UP MARK!
rocbond 2010-01-16
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20021210/13/1247117.html
seahi 2008-07-03
  • 打赏
  • 举报
回复
路过,学习!
highjade 2008-04-29
  • 打赏
  • 举报
回复
关注。。。
jyk1970 2007-10-21
  • 打赏
  • 举报
回复
<script>alert("test");</script>
gzdiablo 2007-05-08
  • 打赏
  • 举报
回复
IE最小化时释放内存 释放得很厉害 但是好像并不是完全释放 只是将内存重新分配并且放入 虚拟内存或者其他什么地方 总之IE最小化后 内存占用将会非常低 基本上只占用1~2M的内存
Tameway 2007-05-08
  • 打赏
  • 举报
回复
最小化会收回内存?

=================================

同问。
joegu 2007-05-08
  • 打赏
  • 举报
回复
mark
mh_rock 2007-05-08
  • 打赏
  • 举报
回复
mark
zjsfdxbao 2007-05-08
  • 打赏
  • 举报
回复
最小化会收回内存?
Tameway 2007-05-07
  • 打赏
  • 举报
回复
收藏,向作者表示敬意。
zhulei2008 2007-05-07
  • 打赏
  • 举报
回复
顶下
adverse 2007-05-07
  • 打赏
  • 举报
回复
aa.e.onclick = null;
那就只能自己手动这么处理了。
dongsj8325 2007-05-06
  • 打赏
  • 举报
回复
关注中。。。。。。。
dh20156 2007-05-06
  • 打赏
  • 举报
回复
不错,学习!
rjzou2006 2007-05-06
  • 打赏
  • 举报
回复
mark
xuStanly 2007-05-06
  • 打赏
  • 举报
回复
此帖值得关注.....
拱,期待大师出手
  • 打赏
  • 举报
回复
保存,收藏,学习,致敬!
raas 2007-05-06
  • 打赏
  • 举报
回复
mark
hubinasm 2007-05-06
  • 打赏
  • 举报
回复
标记一下 HOHO
加载更多回复(19)

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧