本篇是深入的Node的讀書筆記,相關知識點的歸納以及自己的簡介《深入Node》
Node架構一覽

Node架構
libuv架構

libuv架構
V8架構

V8架構
現(xiàn)代JS引擎執(zhí)行: 源代碼(.js)→抽象語法樹(AST)→字節(jié)碼→JIT→本地代碼
V8直接將AST通過JIT編譯為本地代碼,并且在生成本地代碼以后采集相關信息,優(yōu)化本地代碼
Isolate

Isolate
一個 Isolate 是一個獨立的虛擬機。對應一個或多個線程。但同一時刻 只能被一個線程進入。所有的 Isolate 彼此之間是完全隔離的, 它們不能夠有任何共享的資源。如果不顯示創(chuàng)建 Isolate, 會自動創(chuàng)建一個默認的 Isolate。
堆的構成

v8的堆
- 新生區(qū)
大多數(shù)對象開始時被分配在這里。新生區(qū)是一個很小的區(qū)域,垃圾回收在這個區(qū)域非常頻繁,與其他區(qū)域相獨立。 - 老生指針區(qū)
包含大多數(shù)可能存在指向其他對象的指針的對象。大多數(shù)在新生區(qū)存活一段時間之后的對象都會被挪到這里。 - 老生數(shù)據(jù)區(qū)
這里存放只包含原始數(shù)據(jù)的對象(這些對象沒有指向其他對象的指針)。字符串、封箱的數(shù)字以及未封箱的雙精度數(shù)字數(shù)組,在新生區(qū)經(jīng)歷一次 Scavenge 后會被移動到這里。 - 大對象區(qū)
這里存放體積超過 1MB 大小的對象。每個對象有自己 mmap 產(chǎn)生的內(nèi)存。垃圾回收器從不移動大對象。 - Code區(qū)
代碼對象,也就是包含 JIT 之后指令的對象,會被分配到這里。 - Cell 區(qū)、屬性 Cell 區(qū)、Map 區(qū)
這些區(qū)域存放 Cell、屬性 Cell 和 Map,每個區(qū)域因為都是存放相同大小的元素,因此內(nèi)存結構很簡單。
模塊加載
- 如果模塊在緩存中,返回它的exports對象
- 如果是原生的模塊,通過 NativeModule.require() 返回結果
- 否則,創(chuàng)建一個新的模塊,并保存到緩存中
可見,被緩存命中的程序擁有最高加載權
事件循環(huán)

事件循環(huán)