走火入魔javascript – javascript中的垃圾回收机制
javascript的垃圾回收机制是运行环境自动收集机制.也就是说执行环境负责管理代码在执行过程中
使用的内存.
垃圾回收原理:找出内存中不再继续使用的变量,将其所占用的内存释放,开发人员不再关心内存的使用情况,内存的分配已经无用内存的释放完全实现了自动化管理.
垃圾回收的方法有2种:
(1)标记清除
(2)引用计数
标记清除:是目前javascript最常用的一种垃圾回收机制,当变量进入执行环境,将被标记为 “进入环境”
当变量离开执行环境时,将被标记为 “离开环境”.
垃圾收集器在运行时会给存储在内存中的所有变量都加上一个标记,然后检查哪些变量还在环境中使用,将去掉这些变量的标记,检查哪些变量被环境中的变量说引用,也去掉这些变量的标记,最后剩下的这些带有标记的变量将会是”准备被清理的变量”
引用计数:这是一种不太常用的垃圾回收机制,声明一个变量时,并将一个引用类型的值A赋给该变量,这时引用计数的次数会加一.而如果变量又指向了另外一个引用类型的值B时,这时A其实已经没有变量来引用,A的引用次数会减一.
当一个值的引用次数变成0时,垃圾收集器会对其收集并释放响应的内存.
但是这个方式存在一个严重问题.就是创建2个对象,每个对象的ref属性引用另外一个对象,如下代码
var A=new Object();
var B=new Object();
A.ref=B;
B.ref=A;
这样的相互引用,导致A,B俩个引用计数都是1,永远没有变成0的时候,这时垃圾收集器将永远不会对其进行清理.
有的浏览器可以触发垃圾收集过程,比如IE浏览器中 ,调用 windows.CollectGarbage() 或者 opera7及更高版本,调用 window.opera.collect()也可以启动垃圾回收器.但是一般我们不建议这样做.
为了更好,更有效的使用内存,我们建议没有用的对象及时赋值null,这样对象将会快被垃圾收集器处理.