Javascript的垃圾回收机制
在js中,所需内存的分配以及无用内存的回收完全实现了自动管理。垃圾收集机制原理:找出那些不再使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)周期性的执行这一操作垃圾收集的方式有两种:标记清除法和引用计数法。
标记清除法:给存储在内存中的所有变量添加标记,去除掉环境中的变量以及被环境中的变量引用的变量的标记,剩下的带标记的就是准备删除的变量,这是一种比较常用的方法,大多数浏览器中采用的都是这种方法。
引用计数法:声明一个变量,将一个引用类型的值赋值给该变量,则该变量的引用次数就为1,如果该变量又赋值给另一个变量,则该变量引用次数加1,如果包含该变量的引用的变量获取了新的值,则该变量的引用次数减1;如果引用次数为0,则被认为是垃圾进行回收。该方法不太常见,IE9以下的DOM和BOM采用的就是这种垃圾收集方法,该方法在遇到循环引用时会产生内存泄漏,导致已销毁变量的内存空间无法被回收,例如:
1 function test(){ 2 var a=new Object; //a的引用次数为1 3 var b=new Object; //b的引用次数为1 4 a.r=b; //b的引用次数为2 5 b.r=a; //a的引用次数为2 6 }
a与b互相引用,最后两个变量的引用次数都为2,所以当函数执行完后,虽然连个变量都被销毁,但由于它们的引用次数为2,释放的内存无法被回收。所以在IE9以下操做DOM和BOM时就需要注意这个问题,而操做其他对象时IE也是采用的标记清除,不用担心循环引用的问题,IE9以上已经将DOM和BOM对象完全转化为js对象,也不用担心这个问题。
当有不再使用的全局变量和全局对象时,最好通过解除引用将其手动设置为null等待回收机制回收。