每次都听的各种大神回来的面经,总是会提到xxx的垃圾回收,xxx的内存回收,读了《javascript高级程序设计》,对javascript的垃圾回收机制有了个大致的了解,写在这里了就。
javascript的垃圾回收机制
在编写javascript程序的时候,程序员不需要再关心内存的使用问题,因为javascript具有自动垃圾回收机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。
javascript的垃圾回收机制很简单,就是找出不再使用的变量,释放掉他的内存。因为开销比较大,这个过程不是每时每刻都在进行,所以垃圾回收器会按照一定的周期进行操作。
(不再使用的变量就是生命周期结束的变量,这里的变量不包括全局变量,因为全局变量只有在浏览器关闭或者是页面关闭的时候才会被删除)
垃圾回收器将每个变量打上标记,当标记为“无用”的时候,就会对他进行清楚,用于标记无用的策略有很多,常用的为以下两种:
1_标记清除(最常用)
当变量进入环境,比如声明一个变量的时候,就酱这个变量标记为“进入环境”。从逻辑上讲,用于不能释放标记为“进入环境”的变量的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,将其标记为“离开环境”。
垃圾回收器在运行的时候会给存储在内存的所有变量都加上标记(可以以任何的标记方式),然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而再次之后呗加上标记的变量将被视为是准备删除的变量,因为环境中的变量已经无法访问到这些变量了。最后,垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。
IE,Firefox,Opera,Chrome的javascript实现使用的都是这种方法。
2_引用计数(几乎已放弃)
--->跟踪每个值被引用的次数
当声明了ige变量并将一个引用类型值赋给该变量的时候,这个值的引用次数为1,如果同一个值又被赋给了另外一个变量,那么他的引用次数就+1,相反,如果包含这个值引用的变量获得了另外一个值,初始的那个值就相当于拜拜了,引用次数-1,当引用次数变为0的时候,就说明不能访问这个值了,就回收内存空间。
function dby(){
obj1 = new Object();
obj2 = new Object();
obj1.attribute = obj2;
obj2.attribute = obj1;
}
上述例子中,obj1和obj2都通过各自的属性相互引用,所以这两个对象的引用次数都是2,采用计数的方法判定回收的话,他们的引用次数都不可能为0,即不能回收,这就出现了问题,而且如果这个函数被重复调用,事情会变得更加复杂,所以计数方法来判定回收与否不如上述的标记清除方法。
P_78
DA_Again_一年苦行僧