Server
NodeJS
NodeJS
简介
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