垃圾回收机制也称Garbage Collection简称GC。在JavaScript中拥有自动的垃圾回收机制,通过一些回收算法,找出不再使用的变量或属性,由JS引擎按照固定时间间隔周期性的释放其所占的内存空间。
一般的GC算法:
1、引用计数法
设置引用数,判断当前引用数是否为零
优点:可以即时回收垃圾对象,减少程序卡顿时间
缺点:无法回收循环引用的对象,资源消耗较大
2、Mark-Sweep(标记清除)
分标记和清除两个阶段完成,遍历所有的对象找到标记活动对象,遍历所有对象清除没有标记的对象,回收相应的空间。
优点: 循环引用不能回收
缺点:存储空间碎片化、不能立即回收空间
3、Mark-Compact(标记整理)
先标记,再整理成连续的线性空间。
优点:减少碎片化空间,不会立即回收垃圾对象
V8常用GC算法:
- 空间复制
- 标记清除
- 标记整理
- 标记增量
-
分代回收:
-
新生代对象采用复制算法+标记整理。
新生代内存一分为二,活动对象存储于使用空间From中,标记整理后将活动对象copy到空闲空间To。From与To交换空间完成释放。
- 老生代采用标记清除、标记整理、增量标记算法。
老生代就是指存活时间较长的对象,如全局变量下的一些对象和闭包里的数据。