深入浅出Node.js (图灵原创)

2024/10/04 posted in  读书笔记
Tags: 

  •  深入浅出Node.js (图灵原创)|200
  • 书名: 深入浅出Node.js (图灵原创)
  • 作者: 朴灵
  • 简介:
  • 出版时间
  • ISBN:
  • 分类:
  • 出版社:

高亮划线

1.4 Node的特点

  • 📌 兼容Windows和*nix平台主要得益于Node在架构层面的改动,它在操作系统与Node上层模块系统之间构建了一层平台层架构,即libuv。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-12-9290-9361
    • ⏱ 2024-02-21 08:06:30

2.2 Node的模块实现

  • 📌 路径分析、文件定位、编译执行 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-18-1406-1420

    • ⏱ 2024-02-21 08:26:31
  • 📌 require()方法对相同模块的二次加载都一律采用缓存优先的方式, ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-18-1919-1953

    • ⏱ 2024-02-21 08:27:26
  • 📌 这是第一优先级的 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-18-1953-1961

    • ⏱ 2024-02-21 08:28:08
  • 📌 Node会按.js、.json、.node的次序补足扩展名,依次尝试。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-18-6800-6916

    • ⏱ 2024-02-21 08:34:39

3.3 Node的异步I/O

  • 📌 在Node中,除了JavaScript是单线程外,Node自身其实是多线程的,只是I/O线程使用的CPU较少 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-29-8038-8092
    • ⏱ 2024-02-25 20:59:11

3.5 事件驱动与高性能服务器

  • 📌 通过主循环加事件触发的方式来运行程序 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-31-526-544

    • ⏱ 2024-02-25 20:59:12
  • 📌 同步式。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-31-1355-1359

    • ⏱ 2024-02-25 20:59:10
  • 📌 每进程/每请求 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-31-1474-1481

    • ⏱ 2024-02-25 20:59:09
  • 📌 每线程/每请求 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-31-1608-1615

    • ⏱ 2024-02-25 20:59:08

3.6 总结

  • 📌 事件循环是异步实现的核心 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-32-506-518
    • ⏱ 2024-02-25 20:59:10

5.1 V8的垃圾回收机制与内存限制

  • 📌 在V8中,主要将内存分为新生代和老生代两代。新生代中的对象为存活时间较短的对象,老生代中的对象为存活时间较长或常驻内存的对象 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-5872-5934

    • ⏱ 2024-03-28 08:01:50
  • 📌 J. Cheney于1970年首次发表在ACM论文上。
    Cheney算法是一种采用复制的方式实现的垃圾回收算法。它将堆内存一分为二,每一部分空间称为semispace。在这两个semispace空间中,只有一个处于使用中,另一个处于闲置状态。处于使用状态的semispace空间称为From空间,处于闲置状态的空间称为To空间。当我们分配对象时,先是在From空间中进行分配。当开始进行垃圾回收时,会检查From空间中的存活对象,这些存活对象将被复制到To空间中,而非存活对象占用的空间将会被释放。完成复制后,From空间和To空间的角色发生对换。简而言之,在垃圾回收的过程中,就是通过将存活对象在两个semispace空间之间进行复制。
    Scavenge的缺点是只能使用堆内存中的一半,这是由划分空间和复制机制所决定的。但Scavenge由于只复制存活的对象,并且对于生命周期短的场景存活对象只占少部分,所以它在时间效率上有优异的表现。
    由于Scavenge是典型的牺牲空间换取时间的算法,所以无法大规模地应用到所有的垃圾回收中。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-8524

    • ⏱ 2024-03-21 08:41:13
  • 📌 Cheney算法是一种采用复制的方式实现的垃圾回收算法。它将堆内存一分为二,每一部分空间称为semispace。在这两个semispace空间中,只有一个处于使用中,另一个处于闲置状态。处于使用状态的semispace空间称为From空间,处于闲置状态的空间称为To空间。当我们分配对象时,先是在From空间中进行分配。当开始进行垃圾回收时,会检查From空间中的存活对象,这些存活对象将被复制到To空间中,而非存活对象占用的空间将会被释放。完成复制后,From空间和To空间的角色发生对换 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-8632-8877

    • ⏱ 2024-03-21 08:42:48
  • 📌 当一个对象经过多次复制依然存活时,它将会被认为是生命周期较长的对象。这种较长生命周期的对象随后会被移动到老生代中,采用新的算法进行管理。对象从新生代中移动到老生代中的过程称为晋升 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-9877-9966

    • ⏱ 2024-03-21 08:42:22
  • 📌 对象晋升的条件主要有两个,一个是对象是否经历过Scavenge回收,一个是To空间的内存占用比超过限制 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-10275-10326

    • ⏱ 2024-03-21 08:43:50
  • 📌 V8在老生代中主要采用了Mark-Sweep和Mark-Compact相结合的方式进行垃圾回收。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-11896-11944

    • ⏱ 2024-03-21 08:45:09
  • 📌 Mark-Sweep最大的问题是在进行一次标记清除回收后,内存空间会出现不连续的状态。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-12725-12768

    • ⏱ 2024-03-28 08:07:59
  • 📌 垃圾回收的3种基本算法都需要将应用逻辑暂停下来,待执行完垃圾回收后再恢复执行应用逻辑,这种行为被称为“全停顿” ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-14488-14543

    • ⏱ 2024-03-28 08:10:36
  • 📌 增量标记 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-14825-14829

    • ⏱ 2024-03-28 08:11:02

5.2 高效使用内存

  • 📌 在JavaScript中,实现外部作用域访问内部作用域中变量的方法叫做闭包(closure)。这得益于高阶函数的特性:函数可以作为参数或者返回值。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-43-4105-4178

    • ⏱ 2024-03-28 08:21:00
  • 📌 无法立即回收的内存有闭包和全局变量引用这两种情况 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-43-5037-5061

    • ⏱ 2024-03-28 08:23:17

5.3 内存指标

  • 📌 Buffer对象不同于其他对象,它不经过V8的内存分配机制,所以也不会有堆内存的大小限制。
    这意味着利用堆外内存可以突破内存限制的问题。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-44-3752-3900
    • ⏱ 2024-03-28 08:26:05

6.1 Buffer结构

  • 📌 Buffer是一个典型的JavaScript与C++结合的模块,它将性能相关部分用C++实现,将非性能相关的部分用JavaScript实 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-51-708-776
    • ⏱ 2024-03-28 08:39:27

读书笔记

本书评论

« 前端架构:从入门到微前端 Vue.js设计与实现 (霍春阳) »