Server

NodeJS

NodeJS 是一个非阻塞 IO、事件驱动的服务端 JS 运行环境。

简介

NodeJS 是什么?

NodeJS 是一个非阻塞 IO、事件驱动的服务端 JS 运行环境。

非阻塞 IO 是什么?

非阻塞 IO 意味着在执行 IO 操作时,将耗时任务以异步的方式交给子线程处理,等完成之后再通过回调的方式继续执行后续代码。

事件循环机制和浏览器中有什么不同?

TODO,类似但稍有区别。

V8

引擎的垃圾回收机制有了解吗?

V8 使用分代回收机制,将内存分为新生代和老生代空间,分别用不同的算法进行 GC。新生代空间每个周期都会触发 ScavengeGC,俗称小周期。如果两个周期内都没被清除的变量则转移到老生代内存中。老生代空间则使用标记清除算法(和标记紧缩算法)进行清理。

新生代空间的 GC 过程是怎样的?

新生代空间通常只有 1-8 MB,被划分为两个等大的区域,出区和入区。新增变量放到入区中。一但入区满了,便把活跃对象复制到出区中,删除不活跃对象(紧缩过程)并交换出区入区,如此称为一个周期。如果活跃对象再两个周期内都没有被清除,则转移只老生代内存中。

老生代空间的 GC 过程是怎样的?

老生代空间的 GC 分标记和清除(或紧缩)两个阶段。每次循环,标记算法会将一个对象从队列中取出,将它以及邻接对象标记。到了清除阶段,未被标记的对象都将被删除。如果清楚阶段额外执行紧缩过程,则会尝试将零散的对象移动成连续的整体,以解决内存碎片化问题。为了优化老生代空间 GC 的“全停顿”,V8 将老生代空间的标记过程拆分为了子步骤,这样就可以将标记算法穿插在其它任务过程中执行。

API

node:vm 是什么?

node:vm 模块允许在 V8 虚拟机上下文中编译和运行代码,上下文中的任何属性都被视为全局变量,对全局变量任何改动也反映到上下文对象中。但是 node:vm 不是一个安全机制,不应该使用它来运行不受信任的代码。

见:VM

源码解析

NodeJS | require


Copyright © 2024 Lionad - CC-BY-NC-CD-4.0