标记清除
摘自高设:垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记(标记方法不用过多讨论),然后会去掉环境中的变量(比如window.a,obj.b)以及被环境中的变量引用的变量的标记,然后对于那些有标记的变量就会被视为准备删除的变量,原因是环境中已经无法获取到这些变量。
相当于是在判断对象是否可以获得。结果是所有无法从根对象(浏览器环境下就相当于window)获取到的对象都将被清除。
引用
引用计数的含义是跟踪记录每个值被引用的次数。当声明一个变量并将一个引用类型值赋给这个变量时,则该值的引用次数+1。相反如果这个变量又指向另外一个引用值时,那么这个值的引用次数就-1.当一个值的引用次数为0时,他所占的内存就会在下次垃圾回收时被释放。
这种方法的一个缺陷在于循环引用时,
对于这个例子一个dom元素与一个原生的JavaScript对象之间创建了循环引用。由于存在这个循环引用,即使将例子中的dom从页面中移除,他也永远不会被回收。
为了避免类似的循环引用问题,最好是在不使用它们的时候手工断开原生JavaScript对象与dom元素之间的连接。例如:
这个算法是从“对象是否不再需要”角度来进行处理
垃圾回收触发时机
IE7中,触发垃圾收集的变量分配、字面量和数组元素的临界值被调整为动态修正。例如如果例程回收的内存分配量低于15%,则这个临界值就会加倍。如果例程回收了85%的内存分配量,这个临界值会被重置为默认值。
网友评论