一起养成写作习惯!这是我参与「掘金日新计划 · 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引擎以外的东西,执行时间是不可控的。只有当堆内存满了,或到达一个阈值便会触发。