V8引擎垃圾回收机制

V8 是一种开源的JavaScript 引擎,它主要用于Chrome 浏览器和Node.js 环境。V8 引擎中的垃圾回收机制负责自动管理内存的分配和释放,以确保程序运行期间不会出现内存泄漏或垃圾堆积的问题

“全停顿”概念

垃圾回收算法在执行前,需要将应用逻辑暂停,执行完垃圾回收后再执行应用逻辑,这种行为称为 「全停顿」(Stop The World)。例如,如果一次GC需要50ms,应用逻辑就会暂停50ms。为什么会暂停呢?一是因为js是单线程执行的,进入垃圾回收后,js应用逻辑需要暂停,以留出空间给垃圾回收算法运行。另一方面垃圾回收其实是非常耗时间的操作,比如:以 1.5GB 的垃圾回收堆内存为例,V8 做一次小的垃圾回收需要50ms 以上,做一次非增量式(即将所有GC的数据统一处理,不分区/块概念,一次执行)的垃圾回收甚至要 1s 以上。

V8 引擎的垃圾回收机制基于代际假说和分代回收的原理。它将内存分为新生代(young generation)和老生代(old generation)两个代。新生代用于存放新创建的对象,老生代用于存放经过一定时间仍然存活的对象。

新生代空间: 用于存活较短的对象

V8 将新生代内存空间分为两个部分:From 空间和To 空间。新创建的对象首先被分配到From 空间,当From 空间满时,会触发垃圾回收过程。回收过程中,V8 首先进行标记操作,标记活跃的对象,然后将这些对象复制到To 空间,同时进行压缩等操作。最后,From 空间和To 空间的角色互换,完成垃圾回收。

老生代空间: 用于存活时间较长的对象

老生代中的对象由于存活时间较长,垃圾回收的成本较高。V8 使用标记-清除(mark-sweep)和标记-压缩(mark-compact)两种算法进行老生代的垃圾回收。标记-清除算法首先进行标记操作,标记出活跃的对象,然后清除未标记的对象。标记-压缩算法在清除未标记的对象后,将存活的对象压缩到内存的一端,从而减少内存碎片化。

V8 引擎的垃圾回收机制是自动进行的,开发者无需手动管理内存。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容