为什么需要垃圾回收?
在V8引擎逐行执行JavaScript代码的时候时,当遇到函数时会先创建执行上下文并添加到调用堆栈的栈顶,函数的作用域(handleScope)中包含了该函数中声明的所有变量,当该函数执行完毕时,对应的执行上下文从栈顶弹出,函数的作用域也随之销毁,其包含的所有变量也会统一释放并被自动回收。试想如果在这个作用域被销毁的过程中,其中的变量不被回收,即持久占用内存,那么必然会导致内存暴增,从而引发内存泄漏导致程序的性能直线下降甚至崩溃,因此内存在使用完毕之后理当归还给操作系统以保证内存的重复利用。
V8的垃圾回收策略
V8的垃圾回收策略基于分代式垃圾回收机制,其根据对象的存活时间将内存的垃圾回收进行不同的分代,然后对不同的分代采取不同的垃圾回收算法
新生代(new_space):内存最大值64位32MB 32位16MB,采取Scavenge算法
老生代(old_space): 采用新的算法Mark-Sweep(标记清除)和Mark-Compact(标记整理)来进行管理。
