两种垃圾回收机制
1 引用计数法
缺点 对于循环引用将会导致GC无法回收“应该被回收”的内存。造成了无意义的内存占用,也就是内存泄漏。
2 标记清除法的回收机制
在变量进入执行环境时,会添加一个进入标记,当变量离开时,会添加一个离开标记,
标记清除是GC在运行时会给所有变量加上标记,然后去掉那些还在环境中或还被环境中变量引用的变量,清除剩下还被标记的所有变量。
-
标记阶段:把所有活动对象做上标记。
-
清除阶段:把没有标记(也就是非活动对象)销毁。
标记阶段

根可以理解成我们的全局作用域,GC从全局作用域的变量,沿作用域逐层往里遍历(对,是深度遍历),当遍历到堆中对象时,说明该对象被引用着,则打上一个标记,继续递归遍历(因为肯定存在堆中对象引用另一个堆中对象),直到遍历到最后一个(最深的一层作用域)节点。

标记完成之后,就是这样的:

清除阶段
又要遍历,这次是遍历整个堆,回收没有打上标记的对象。
3 什么是内存泄漏
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
内存泄漏的实例
使用不当的闭包将会在IE(IE9之前)中造成内存泄漏
IE9的JavaScript引擎使用的垃圾回收算法是引用计数法,对于循环引用将会导致GC无法回收“应该被回收”的内存。造成了无意义的内存占用,也就是内存泄漏。