1、为什么要垃圾回收?
程序在执行的时候,会在内存中占用一系列的资源,例如js里的变量,函数,对象等等。这些占用内存却没有再次使用的,我们称之为“垃圾”,而对“垃圾”占用的内存的回收,就是垃圾回收。如果没有垃圾回收,那么只能人工去做清除,这样很容易导致内存泄漏等问题。
2、什么是标记清除?
早在C语言诞生之前的1960年,图灵奖得主John McCarthy就在Lisp语言中实现了自动垃圾回收算法。算法本身其实非常简单,标记那些程序访问不到的数据,回收它们的内存空间。但是,垃圾回收算法把程序员从硬件层(内存管理)解放出来了,这种理念还是很先进的。分别是:“标记清除”、“引用计数”、“复制算法”,后续的垃圾回收算法,都是基于这三大算法做的组合与优化。JavaScript常用的垃圾回收机制有两种:标记清除法、引用计数法,这里主要弄懂目前主流的“标记清除法”。顾名思义,标记清除法一定会有两个阶段,标记阶段与清除阶段。
3、标记阶段
首先从根节点出发,线性遍历所有可达对象,在活动的对象头打上活动的标记。此处的根节点root对象,从js引擎的角度作者认为应当是包括全局对象以及程序当前的执行堆栈(大家可以在留言区讨论一下标记清楚法中的“根节点”是什么?)。
4、清除阶段
再次遍历对象,检查对象头,对于没有活动标记的对象,将其内存空间释放;对于有活动标记的对象,去掉标记。
5、优缺点是什么?
优点:代替了人工释放内容,极大的优化了操作,思路简单,实现简单
缺点:标记时要暂停整个程序,大型应用会比较明显卡顿。内存出现碎片化。
6、V8的垃圾回收模块Orinoco: