深入Node

作者: Mr_Treasure | 来源:发表于2018-03-29 23:02 被阅读20次

    本篇是深入的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,每个区域因为都是存放相同大小的元素,因此内存结构很简单。

    模块加载

    1. 如果模块在缓存中,返回它的exports对象
    2. 如果是原生的模块,通过 NativeModule.require() 返回结果
    3. 否则,创建一个新的模块,并保存到缓存中

    可见,被缓存命中的程序拥有最高加载权

    事件循环

    事件循环

    相关文章

      网友评论

        本文标题:深入Node

        本文链接:https://www.haomeiwen.com/subject/orzvcftx.html