一種將支援垃圾回收的程式語言高效引入到 WebAssembly 的新方式
最近的一篇關於 WebAssembly 垃圾回收 (WasmGC) 的文章從高層次解釋了 垃圾回收 (GC) 提案 如何更好地支持 Wasm 中的垃圾回收語言,這在考慮到它們的普及性時,非常重要。在本文中,我們將探討技術細節,了解像 Java、Kotlin、Dart、Python 和 C# 這樣的垃圾回收語言如何被移植到 Wasm。事實上有兩種主要的方法:
最近的一篇關於 WebAssembly 垃圾回收 (WasmGC) 的文章從高層次解釋了 垃圾回收 (GC) 提案 如何更好地支持 Wasm 中的垃圾回收語言,這在考慮到它們的普及性時,非常重要。在本文中,我們將探討技術細節,了解像 Java、Kotlin、Dart、Python 和 C# 這樣的垃圾回收語言如何被移植到 Wasm。事實上有兩種主要的方法:
控制流完整性(CFI)是一種旨在防止利用漏洞劫持控制流程的安全功能。其核心理念是,即使攻擊者成功破壞了進程的記憶體,額外的完整性檢查也可以阻止他們執行任意代碼。在這篇部落格中,我們將討論我們在 V8 中啟用 CFI 的工作。
這篇博客由 José Dapena Paz (Igalia) 撰寫,Jason Williams (Bloomberg), Ashley Claymore (Bloomberg), Rob Palmer (Bloomberg), Joyee Cheung (Igalia), 和 Shu-yu Guo (Google) 共同參與。
在這篇文章中,我將討論 Bloomberg 工程師發現的 V8 堆快照中的一些性能問題,以及我們如何修復這些問題以使 JavaScript 記憶體分析比以往更快。
Bloomberg 工程師正在診斷一個 JavaScript 應用程式中的記憶體洩漏問題。該應用報錯 Out-Of-Memory。對於所測試的應用程式,V8 堆限制被設置大約為 1400 MB。通常情況下,V8 的垃圾回收器應該可以使堆使用量保持在這個限制以下,因此該錯誤表明可能存在記憶體洩漏。
我們在 V8 v11.2 推出了 WebAssembly 尾呼叫!在本文中,我們將簡要概述此提案,展示 C++ 協程與 Emscripten 的一個有趣用例,並說明 V8 如何內部處理尾呼叫。
一個呼叫被稱為處於尾部位置(tail position),如果它是目前函數在返回之前執行的最後指令。編譯器可以通過丟棄調用者的幀並將呼叫替換為跳轉來優化此類呼叫。
這對於遞歸函數特別有用。例如,以下是使用 C 寫成的函數計算鏈表中元素的總和:
int sum(List* list, int acc) {
if (list == nullptr) return acc;
return sum(list->next, acc + list->val);
}
使用常規呼叫,這將消耗 𝒪(n) 的堆棧空間:鏈表的每個元素都會在呼叫堆棧中增加一個新幀。鏈表足夠長時,可能很快就會導致堆棧溢出。通過將呼叫替換為跳轉,尾呼叫優化有效地將此遞歸函數轉換為使用 𝒪(1) 堆棧空間的循環:
當我編譯一個使用不到 4GB RAM 的程式時,使用 64 位元指標是完全荒謬的。在結構體中出現這些指標值時,它們不僅浪費了一半的記憶體,還有效地丟掉了一半的快取。
歷史上,每個 V8 的新版本分支都有一篇部落格文章發布。您可能注意到自 v9.9 以來沒有新的版本部落格文章了。從 v10.0 開始,我們將停止為每個新分支發佈版本部落格文章。但不用擔心,以前您從部落格文章中獲取的所有資訊仍然可以找到!繼續閱讀以了解前往何處獲取這些資訊。
注意: 本文最初發表於 Google 安全部落格。
Chrome 中的記憶體安全性 是為了保護使用者而持續進行的努力。我們不斷地實驗不同的技術,以搶先惡意攻擊者一步。在這種精神下,本文將介紹我們使用堆積掃描技術改進 C++ 記憶體安全性的旅程。
自 v8 v7.2 開始,類字段已在 V8 中推出,而私有類方法自 v8.4 啟用。隨著相關提案於 2021 年達到第 4 階段,針對 V8 中新類特性的支持改進工作開始啟動 —— 在此之前,這些特性的採用主要受到兩個問題的影響:
雖然這篇文章的標題可能暗示我們要深入探討關於油底殼的書籍集合——考慮到油底殼的建造規範,這是一個有著驚人文獻的話題——但實際上我們會更深入探討 Oilpan,一個由 V8 作為圖書館自 V8 v9.4 起托管的 C++ 垃圾回收器。