性能问题

最近都在用印象笔记记录这段时间的学习历程,但是这两天给登不上去了,网上查了一系列办法都没用,心累,暂时先用回CSDN吧。

今天的博客主要是怎么销毁已有对象的问题,便又去翻了一遍高程,了解了一下垃圾回收机制。

JavaScript是自动进行垃圾回收的,原理是,周期性的执行操作将不再继续使用的变量释放,那么怎么判断哪些变量不再使用了呢?

主要有两种方法:

1、标记清除法

其实啰嗦那么一大堆,我的理解就是将内存中的所有变量都加上标记,然后去掉那些在环境中的变量和被引用的对象,剩下的变量都被看作是准备删除的变量,最后会被垃圾收集器完成内存清除的工作。

2、引用计数法

这种方法不太常见,主要是它容易引起问题,这个后面再说。

这个方法呢,我的理解就是记录每个变量被引用的次数,当引用次数变成0的时候就被会垃圾收集器收集,完成内存清除的工作。那么这个引用次数怎么计算呢?当声明一个变量并将引用类型的值赋值给它时,该值的引用次数即为1;如果同一个值被赋值给另外一个变量时,该值的引用次数加1。

前面说到它容易引起问题,就是因为循环引用的两个对象会相互的引用次数永远不会为0,若包含他们的函数又被多次调用的话,会导致内存泄露而大量的内存不能被回收。

正因为这个问题,现在IE、FireFox、Opera、chrome和Safari的JavaScript的实现都是使用标记清除法,然而,IE中有一部分对象不是原生JavaScript对象,比如BOM和DOM中的对象是使用C++以COM对象的形式实现,而COM对象的垃圾回收机制采用的是引用计数法,可以说,只要在IE中涉及COM对象,都会存在循环引用的问题。

这类原因导致的问题例如:闭包的作用域中保存着一个HTML元素,那么久意味着该元素将无法销毁。

function assignHandler(){
    var element = document.getElementById('someElement');
    element.onclick = function(){
          alert(element.id);
     } 
}


这里的闭包里面虽然是引用的element.id,但是会导致element的引用数无法减少,因此它占用的内存永远无法被回收,解决办法:

function assignHandler(){
    var element = document.getElementById('someElement');
    var id = element.id;
    element.onclick = function(){
          alert(id);
     };
    element = null;
}

这样可以解除对DOM对象的引用,确保正常回收其占用的内存。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值