1、标记清除(mark and sweep)
标记清除是 JavaScript 最常见的垃圾回收机制,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为 “进入环境
”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境
”。
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了。
2、引用计数 (reference counting)
在低版本 IE
中经常出现内存泄漏,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量,并将一个引用类型赋值给该变量的时候,这个值的引用次数就加1
,如果该变量的值变成了另外一个,则这个值的引用次数减1
,当这个值的引用次数变为 0
的时候,说明没有变量在使用,这个值就没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为 0 的值占用的空间。
3、注意
在 IE
中,虽然 JavaScrip
t 对象通过标记清除的方式进行垃圾回收,但 DOM
和 BOM
对象确是通过引用计数方式进行垃圾回收,也就是说,只要涉及 BOM
及 DOM
就会出现循环引用问题。