JavaScript垃圾(内存)收集机制及其性能问题

JavaScript具有自动垃圾收集机制,其真实含义为:执行环境会负责管理代码执行过程中的使用的内存。

垃圾收集机制原理:

找出那些不再继续使用的变量,然后释放其占有的内存,为此,垃圾收集机制会按照固定的时间间隔周期性地执行这一操作。

局部变量只再函数执行过程中存在,而在这个过程中,会为局部变量在栈内存(或堆内存)上分配相应的空间,以便存储它们的值,然后在函数调用过程中使用这些变量,直到函数执行完毕。这时,局部变量就没有存在的必要了,可以释放它们的内存空间。

垃圾收集器会跟踪每个变量,跟踪哪些变量有用,哪些变量没用,对于没用的变量打上标记,以备将来回收其占用的内存。对于表示无用变量的策略可能会因浏览器而异。

垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方 式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记 的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器 完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。 ----引自《JavaScript高级程序设计》

到 2008年为止,IE、Firefox、Opera、Chrome和 Safari的 JavaScript实现使用的都是标记清除式的 垃圾收集策略(或类似的策略),只不过垃圾收集的时间间隔互有不同   ----引自《JavaScript高级程序设计》

垃圾收集机制是周期性运行的,而且如果为变量分配的内存空间较大,那么回收机制的公国两也是相当大。在这种情况下,确定垃圾收集机制的时间间隔是一个十分重要的问题。

内存限制问题

使用具有垃圾收集机制的语言编写程序,开发人员一般不用担心内存管理问题。但是,在JavaScript在进行内存管理时与垃圾回收时面临的问题还是与众不同的,其中最主要的一个问题,就是分配给浏览器可用的内存数量通常要比分配跟桌面应用程序的内存数量要少。这样做的目的是为了防止运行JavaScript的网页耗尽全部的内存而导致系统崩溃,内存限制问题不仅会影响给变量分配内存,同时还会影响调用栈以及在一个线程中,能够同时执行的代码数量。

因此,确保占用最少的内存,可以让页面获得更好的性能。而优化内存占用的最佳方式就是为执行中的代码只保存必要的数据,一旦数据不再有用,最好将其设置为null来释放,这个方法叫——解除引用(dereferencing)。如下面这个例子所示。

<script type="text/javascript">
    function buyBook(){
        var book = new object();
        book.name = name;
        return book;
    }
    var globalBook = buyBook('three body');
    globalBook = null;//手工解除globalBook的引用
    </script>

由于变量book在函数执行完毕后就离开了其执行环境(作用域),因此不用显示的为它解除引用,但是对于全局变量globalBook,则需要我们在不使用它的时候手工为它解除引用,这也是上面最后一行代码的作用。

注意的是,解除一个值的引用并不以为着自动回收该值所占有的内存,解除引用的真正目的是让值脱离执行环境(作用域),以便垃圾收集器下次运行时将其回收。



猜你喜欢

转载自blog.csdn.net/yufanhui/article/details/80976424