JavaScript之垃圾回收

    JavaScript具有自动垃圾回收机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。

1、标记清除

    JavaScript中最常用的垃圾收集方式是标记清除。当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为"进入环境"。从逻辑上讲,永远不能释放进入环境的变量所占的内存,因为只要执行流进入相应的环境就可能用到它们。当执行流离开该环境时,则将其变量标记为"离开环境"。
    到2008年,绝大多数浏览器都使用标记清除的垃圾回收策略,只不过垃圾收集的间隔时间有所不同。

2、引用计数

    另外一种不常见的垃圾收集策略叫做引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数+1,反之-1。当这个值的引用次数变成0时,则说明没有办法在访问这个值了,因此就可以将该值所占的内存空间回收回来。
    但这种方式会遇到一个严重问题:循环引用。如下代码所示:
//循环引用
function problem() {
    var obj1 = new Object();
    var obj2 = new Object();
    obj1.otherObject = obj2;
    obj2.anotherObject = obj1;
}

3、性能问题

    随着IE7的发布,触发垃圾回收的变量分配、字面量或数组元素的临界值被调整为动态修正。事实上,在有的浏览器中可以触发垃圾回收过程,但不建议这么做。在IE中,调用window.CollectGarbage()方法会立即执行垃圾回收。在Opera7及更高版本中,调用window.opera.collect()也会启动垃圾回收。

4、管理内存

    确保占用最少内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是为执行中的代码只保留必要的数据。一旦数据不再使用,最好将该值设置为null来释放其引用——这个做法叫做"引用解除"。这一做法适用于大多数全局变量和局部变量。局部变量会在执行流离开执行环境时自动解除。
    值得注意的是,解除一个值的引用并不意味着自动回收该值所占的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。
posted @ 2013-05-17 22:20  烧点饭  阅读(527)  评论(0编辑  收藏  举报