垃圾回收和内存管理

内存管理是很重要的一部分,系统分配给浏览器的内存空间很少,如果不能很好的管理内存很可能因为某个页面导致浏览器的崩溃。

虽然js有垃圾回收机制,但是在程序中如果不用的对象,要及时释放引用等待gc回收

js垃圾回收的机制

1. 标记清除

当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。

2. 引用计数

基本原理就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。

 

引用计数有很大的问题,因为可能有些对象的引用计数永远不可能为0,所以js都是用标记清除的方式。

但是在IE中有一部分对象并不是原生的js对象,比如BOM和DOM 使用C++以COM(Component Object Model) 对象形式存在的,而COM对象的垃圾回收策略就是采用引用计数的。因此即使IE的JS引擎使用标记清除,但是JS访问的COM对象依然是引用计数策略,也就是使用了COM对象就会存在循环引用问题。

 

导致内存泄漏例子

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

在匿名函数中保存了element的引用,所以element的引用次数永远不可能为0,也就是永远不可能被回收。

解决上述问题,让我们修改如下

function assignHandlers(){
    var element = document.getElementById("se");
    var id = element.id;
    element.onclick = function(){
        alert(id);
    }
    element = null;
}

将匿名函数要用的数据保存到assignHandler函数作用域下的临时变量中,然后将删除element对象的引用。

注:闭包会引用包含函数的整个活动对象,即使没有直接引用element,但活动对象中包含了element的引用,所以必须把element设置为null才可以。

 

posted @ 2014-12-04 15:47  lcw5945  阅读(400)  评论(0编辑  收藏  举报