深入Node
2018-03-29 本文已影响20人
Mr_Treasure
本篇是深入的Node的读书笔记,相关知识点的归纳以及自己的简介《深入Node》
Node架构一览
Node架构libuv架构
libuv架构V8架构
V8架构现代JS引擎执行: 源代码(.js)→抽象语法树(AST)→字节码→JIT→本地代码
V8直接将AST通过JIT编译为本地代码,并且在生成本地代码以后采集相关信息,优化本地代码
Isolate
Isolate一个 Isolate 是一个独立的虚拟机。对应一个或多个线程。但同一时刻 只能被一个线程进入。所有的 Isolate 彼此之间是完全隔离的, 它们不能够有任何共享的资源。如果不显示创建 Isolate, 会自动创建一个默认的 Isolate。
堆的构成
v8的堆- 新生区
大多数对象开始时被分配在这里。新生区是一个很小的区域,垃圾回收在这个区域非常频繁,与其他区域相独立。 - 老生指针区
包含大多数可能存在指向其他对象的指针的对象。大多数在新生区存活一段时间之后的对象都会被挪到这里。 - 老生数据区
这里存放只包含原始数据的对象(这些对象没有指向其他对象的指针)。字符串、封箱的数字以及未封箱的双精度数字数组,在新生区经历一次 Scavenge 后会被移动到这里。 - 大对象区
这里存放体积超过 1MB 大小的对象。每个对象有自己 mmap 产生的内存。垃圾回收器从不移动大对象。 - Code区
代码对象,也就是包含 JIT 之后指令的对象,会被分配到这里。 - Cell 区、属性 Cell 区、Map 区
这些区域存放 Cell、属性 Cell 和 Map,每个区域因为都是存放相同大小的元素,因此内存结构很简单。
模块加载
- 如果模块在缓存中,返回它的exports对象
- 如果是原生的模块,通过 NativeModule.require() 返回结果
- 否则,创建一个新的模块,并保存到缓存中
可见,被缓存命中的程序拥有最高加载权