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等待回收机制回收。

  

原文地址:https://www.cnblogs.com/cjw-ryh/p/7132511.html