Javascript的内存释放实验

213 篇文章 0 订阅
192 篇文章 0 订阅

http://topic.csdn.net/t/20021210/13/1247117.html

 

http://topic.csdn.net/u/20070501/09/eeb7bb7b-ebe9-432d-a496-87a645e75cfd.html

 

有很多人提到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的内存不会被自动回收   但不是不能被回收
怎么回收   那就要靠你自己动手来写了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在中,内存泄漏是指不再需要的内存没有被正确释放,导致内存占用不断增加,最终导致程序性能下降或崩溃。引起内存泄漏的原因有很多,以下是一些常见的原因: 1. 意外地创建全局变量:如果在函数中没有使用var、let或const关键字声明变量,那么该变量将成为全局变量,即使函数执行完毕后也不会被回收。 2. 定时器未清除:如果在使用setInterval或setTimeout创建定时器后,没有及时清除定时器,那么定时器中引用的函数和变量将不会被释放。 3. 闭包中引用的外部变量未释放:闭包是指一个函数与其相关的引用环境组合的组合体。如果一个函数内部定义了一个函数,并且内部函数引用了外部函数的变量,那么即使外部函数执行完毕,内部函数仍然保持对外部函数变量的引用,导致内存泄漏。 4. DOM元素引用未释放:在JavaScript中,通过getElementById等方法获取的DOM元素,如果在程序执行完毕后没有及时释放对该元素的引用,那么该元素将无法被垃圾回收机制回收。 为了避免内存泄漏,可以采取以下措施: 1. 在函数中使用var、let或const关键字声明变量,避免意外地创建全局变量。 2. 在使用定时器后,及时清除定时器,避免定时器中引用的函数和变量无法被释放。 3. 尽量避免使用闭包,或者在使用闭包时,确保闭包中引用的外部变量在不再需要时能够正确释放。 4. 在使用DOM元素后,及时释放对该元素的引用,可以通过将元素设置为null来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值