Node.js 中的 V8 引擎詳解


我們將學習 V8 引擎、Node.js 以及 V8 和 Node.js 之間的聯絡。

V8 JavaScript 引擎概述

V8 是 Google 開發的一個高效能 JavaScript 引擎,用於 Google 的開源瀏覽器 Google Chrome。它旨在透過將 JavaScript 編譯成原生機器碼而不是解釋它來提高 Web 應用程式的效能,從而使其速度更快。

V8 是一個基於C++ 的開源 JavaScript 引擎。它執行在各種平臺上,例如 Linux、Windows 和 macOS。它具有即時 (JIT) 編譯、垃圾收集以及對現代 JavaScript 功能(例如類、Promise 和箭頭函式)的支援等特性,使其特別適合 Web 瀏覽器。它還支援 WebAssembly,這是一種用於在 Web 上執行程式碼的低階二進位制格式,其設計速度比 JavaScript 更快。

現代 Web 應用程式很大程度上依賴 JavaScript 來實現其功能。因此,V8 需要能夠快速有效地執行 JavaScript 程式碼。為了實現此功能,V8 使用各種技術(例如隱藏類最佳化和內聯快取)來儘可能快地執行 JavaScript 程式碼。Rhino、SpiderMonkey、JerryScript 等是一些流行的 JavaScript 引擎。

V8 Javascript 引擎的一些重要元件

這些是 V8 JavaScript 引擎的一些重要元件,使其成為 node.js 應用程式的高效能引擎。

  • 垃圾回收

  • JS 直譯器

  • WebAssembly

垃圾收集器

V8 JavaScript 包含一個垃圾收集器。它釋放不再需要的物件使用的記憶體。當應用程式建立物件但在不再需要時未能正確釋放它們時,就會發生記憶體洩漏。垃圾收集器有助於防止這種記憶體洩漏。

JS 直譯器

在 V8 中,Ignition 首先解釋 JavaScript 程式碼,它是一個位元組碼直譯器。Ignition 讀取程式碼並對其進行評估,執行程式碼指定的動作。這完成得很快,但是 Ignition 生成的位元組碼不如機器碼高效;此位元組碼將傳遞給 Turbofan,它是 V8 的最佳化編譯器。

Turbofan 分析位元組碼併為程式碼的關鍵效能部分生成機器碼。此機器碼比位元組碼更快,但編譯過程可能需要更長時間。編譯後的機器碼會被快取,以便如果再次執行相同的指令碼,則可以重用它,從而避免重新編譯程式碼。

使用 Ignition 和 Turbofan,V8 可以使用位元組碼直譯器快速評估程式碼,然後使用最佳化編譯器最佳化關鍵效能部分。這使得 V8 能夠實現高效能和高效執行 JavaScript 程式碼。

WebAssembly

WebAssembly(通常縮寫為 wasm)是一種面向堆疊的虛擬機器的二進位制指令格式。在 V8 JavaScript 引擎中,WebAssembly 程式碼由 Liftoff 元件執行。它是一個 WebAssembly 專用編譯器,旨在快速、輕量級,並與 V8 無縫整合。它負責將二進位制 wasm 程式碼轉換為機器碼並執行它。

使用 Liftoff,V8 提供了一種快速有效的方法來執行與 JavaScript 並行的 WebAssembly 程式碼,允許開發人員使用多種語言編寫程式碼並在 Web 上高效地執行它。

Node.js 和 V8 之間的聯絡

Node.js 是一個構建在 V8 JavaScript 引擎之上的 JavaScript 執行時。它允許開發人員在伺服器上執行 JavaScript 來構建網路應用程式,使用 JavaScript 作為前端和後端的程式語言。Node.js 使用 V8 在伺服器端執行 JavaScript 程式碼。當開發人員為 Node.js 應用程式編寫 JavaScript 程式碼時,該程式碼將傳遞給 V8 以執行。然後 V8 編譯並執行程式碼,允許應用程式執行諸如讀取和寫入檔案、發出網路請求以及與資料庫互動之類的操作。

Node.js 和 V8 之間的聯絡在於 Node.js 使用 V8 作為其 JavaScript 執行時。Node.js 在 V8 之上提供額外的功能層,例如庫和模組,以支援 JavaScript 中的伺服器端程式設計。

其他一些事實

Node.js 最初使用 V8 作為 JavaScript 引擎實現。Joyent 的初始開發人員選擇嵌入 V8 是因為它具有高效能並且能夠處理他們認為構建 Web 伺服器所需的併發性。

雖然 Node.js 從技術上講可以在沒有 V8 的情況下工作,但這需要大量的開發工作。開發人員需要選擇另一個 JavaScript 引擎並修改 Node.js 程式碼庫以使用它。此外,如果沒有 V8,Node.js 的效能將大大降低,並且需要對新引擎進行大量的最佳化。因此,選擇另一個 JavaScript 引擎可能並不合適。因此,Node.js 很不可能在沒有 V8 的情況下工作,因為 V8 是 Node.js 程式碼庫不可或缺的一部分,並提供了大多數 Node.js 使用案例所需的效能。

記憶體相關問題

目前,預設情況下,V8 在 32 位系統上的記憶體限制為 512 MB,在 64 位系統上的記憶體限制為 1GB。如果您的 Node.js 程序需要的記憶體超過堆中可用的記憶體,則此限制可能會導致問題。例如,假設您嘗試將大型資料集載入到記憶體中或執行復雜的計算。在這種情況下,您可能會耗盡記憶體並收到“FATAL ERROR: JavaScript heap out of memory”錯誤。

一些解決記憶體相關問題的技巧

尋找減少程式碼使用的記憶體量的方法。這可能包括減小資料結構的大小、快取常用資料或避免建立不必要的物件。

要增加可用的記憶體堆,請在執行 Node.js 應用程式時使用 --max-old-space-size 命令列標誌。

另一種解決方案是,如果您的資料集太大而無法由單個節點處理,您可以考慮拆分資料並並行執行指令碼的多個例項。

請注意,效能影響在不同的作業系統和環境中可能會有所不同。

更新於:2023年3月17日

瀏覽量 1K+

開啟您的職業生涯

完成課程後獲得認證

開始學習
廣告