2024/10/04
posted in
读书笔记
2024/10/04
posted in
读书笔记
- 书名: 深入浅出Node.js (图灵原创)
- 作者: 朴灵
- 简介:
- 出版时间
- ISBN:
- 分类:
- 出版社:
📌 路径分析、文件定位、编译执行 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-18-1406-1420
📌 require()方法对相同模块的二次加载都一律采用缓存优先的方式, ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-18-1919-1953
📌 这是第一优先级的 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-18-1953-1961
📌 Node会按.js、.json、.node的次序补足扩展名,依次尝试。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-18-6800-6916
📌 通过主循环加事件触发的方式来运行程序 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-31-526-544
📌 同步式。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-31-1355-1359
📌 每进程/每请求 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-31-1474-1481
📌 每线程/每请求 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-31-1608-1615
📌 在V8中,主要将内存分为新生代和老生代两代。新生代中的对象为存活时间较短的对象,老生代中的对象为存活时间较长或常驻内存的对象 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-5872-5934
📌 J. Cheney于1970年首次发表在ACM论文上。
Cheney算法是一种采用复制的方式实现的垃圾回收算法。它将堆内存一分为二,每一部分空间称为semispace。在这两个semispace空间中,只有一个处于使用中,另一个处于闲置状态。处于使用状态的semispace空间称为From空间,处于闲置状态的空间称为To空间。当我们分配对象时,先是在From空间中进行分配。当开始进行垃圾回收时,会检查From空间中的存活对象,这些存活对象将被复制到To空间中,而非存活对象占用的空间将会被释放。完成复制后,From空间和To空间的角色发生对换。简而言之,在垃圾回收的过程中,就是通过将存活对象在两个semispace空间之间进行复制。
Scavenge的缺点是只能使用堆内存中的一半,这是由划分空间和复制机制所决定的。但Scavenge由于只复制存活的对象,并且对于生命周期短的场景存活对象只占少部分,所以它在时间效率上有优异的表现。
由于Scavenge是典型的牺牲空间换取时间的算法,所以无法大规模地应用到所有的垃圾回收中。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-8524
📌 Cheney算法是一种采用复制的方式实现的垃圾回收算法。它将堆内存一分为二,每一部分空间称为semispace。在这两个semispace空间中,只有一个处于使用中,另一个处于闲置状态。处于使用状态的semispace空间称为From空间,处于闲置状态的空间称为To空间。当我们分配对象时,先是在From空间中进行分配。当开始进行垃圾回收时,会检查From空间中的存活对象,这些存活对象将被复制到To空间中,而非存活对象占用的空间将会被释放。完成复制后,From空间和To空间的角色发生对换 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-8632-8877
📌 当一个对象经过多次复制依然存活时,它将会被认为是生命周期较长的对象。这种较长生命周期的对象随后会被移动到老生代中,采用新的算法进行管理。对象从新生代中移动到老生代中的过程称为晋升 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-9877-9966
📌 对象晋升的条件主要有两个,一个是对象是否经历过Scavenge回收,一个是To空间的内存占用比超过限制 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-10275-10326
📌 V8在老生代中主要采用了Mark-Sweep和Mark-Compact相结合的方式进行垃圾回收。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-11896-11944
📌 Mark-Sweep最大的问题是在进行一次标记清除回收后,内存空间会出现不连续的状态。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-12725-12768
📌 垃圾回收的3种基本算法都需要将应用逻辑暂停下来,待执行完垃圾回收后再恢复执行应用逻辑,这种行为被称为“全停顿” ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-14488-14543
📌 增量标记 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-42-14825-14829
📌 在JavaScript中,实现外部作用域访问内部作用域中变量的方法叫做闭包(closure)。这得益于高阶函数的特性:函数可以作为参数或者返回值。 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-43-4105-4178
📌 无法立即回收的内存有闭包和全局变量引用这两种情况 ^CB-E4RGfTGgo6VO6lu6keCOJ2G5-43-5037-5061