v8垃圾回收机制笔记(一)

163 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

GC(Garbage Collection) 垃圾回收

一、v8内存分配

栈Stack 对于v8也是执行环境。所以垃圾回收机制不会涉及到栈。

堆Heap 内存又分为很多部分,如下:

1、New space 新生代

2、Old space 老生代

3、Large object space 大对象空间

4、Code space 代码空间,即时编译器(JIT)。所以js代码会在这里直接执行,可执行的内存空间。

5、cell space 单位空间

6、propertycell space 属性单位空间

7、Map space 地图空间

而负责垃圾回收机制的只有 新生代 与 老生代

二、新生代与老生代的空间划分,严格对半分

新生代分为两部分,Semi space (from), Semi space (to)

老生代也分成两部分,old point space, old date space,是一个连续的空间

三、内存大小

1、和操作系统有关,64位为1.4G(1464MB),32位为0.7G(732MB)

2、64位新生代空间为64MB,老生代为1400MB

3、32位新生代空间为32MB,老生代为700MB

4、最新版的node(v14)的内存为2G

四、为何要把v8内存设计为1.4G?

1、先有js,再有node

2、js的产品定位为 浏览器渲染

3、js/node 一个显著的特点是异步单线程,而垃圾回收机制是自动运行的,也需要运行进程。回收一次1.5G的堆内存,需要50ms以上。

4、node 读写大文件时,有时会超过1G,可用webpack编译大型项目的代码/环境,都有可能内存空间会占用到1.4G

5、js的发明者认为js是不持久化的代码

持久化:即数据库类固定的东西,而前端大多是跑完就丢了。

总结:前端代码是不持久化的,且前端更多是轻业务,所以没必要设计过大的内存空间。若需要的话也可以扩充。如node的底层是c++,可通过扩充底层c++模块来实现。

五、垃圾回收什么时候触发?

垃圾回收机制是游离在js引擎以外的东西,执行时间是不可控的。只有当堆内存满了,或到达一个阈值便会触发。