JavaScript的垃圾回收机制
垃圾回收的必要性
由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。JavaScript的解释器可以检测到何时程序不再使用一个对象了,当他确定了一个对象是无用的时候,他就知道不再需要这个对象,可以把它所占用的内存释放掉了。譬如:
var a = '1'
var b = '2'
a = b//这个时候a引用失效并且内存分配就无用化了
垃圾回收原理
现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数。
标记清除(常见)
垃圾收集器在某环境中运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。然后,它会去掉环境中的变量的标记以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。
引用计数(相互引用和循环引用将导致内存泄漏)
引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。
减少JavaScript中的垃圾回收(提升创建变量的重用率)达成优化
针对对象的优化
- 为了最大限度的实现对象的重用,应该像避使用new语句一样避免使用{}来新建对象。
- 在获取数据并将其存取的过程中,尽量用全局对象来进行存取
cr.wipe(obj)
方法能够保证对象(确保对象prototype上没有属性)的重复利用,那就是遍历此对象的所有属性,并逐个删除,最终将对象清理为一个空对象。
针对数组的优化
- 将数组长度赋值为0(arr.length = 0)也能达到清空数组的目的,并且同时能实现数组重用,减少内存垃圾的产生。
针对方法的优化
- 尽量避免动态创建方法对象
库中的垃圾避免
要尽量避免对库中会大量产生内存垃圾的方法的调用