Oilpan 中的指標壓縮
當我編譯一個使用不到 4GB RAM 的程式時,使用 64 位元指標是完全荒謬的。在結構體中出現這些指標值時,它們不僅浪費了一半的記憶體,還有效地丟掉了一半的快取。
當我編譯一個使用不到 4GB RAM 的程式時,使用 64 位元指標是完全荒謬的。在結構體中出現這些指標值時,它們不僅浪費了一半的記憶體,還有效地丟掉了一半的快取。
雖然這篇文章的標題可能暗示我們要深入探討關於油底殼的書籍集合——考慮到油底殼的建造規範,這是一個有著驚人文獻的話題——但實際上我們會更深入探討 Oilpan,一個由 V8 作為圖書館自 V8 v9.4 起托管的 C++ 垃圾回收器。
我們之前已多次撰文討論過JavaScript 的垃圾回收、文件物件模型 (DOM) 及其在 V8 中的實現及優化。然而,Chromium 中並不全是 JavaScript,瀏覽器本身及 V8 所嵌套的 Blink 渲染引擎大多數使用 C++ 編寫。JavaScript 可用於操作 DOM,而後者由渲染管線進行處理。
記憶體和效能之間總是一場持續的鬥爭。作為使用者,我們希望事情既快速又盡可能少地消耗記憶體。不幸的是,通常提升效能會以增加記憶體消耗為代價(反之亦然)。
2018 年底,我們啟動了一個名為 V8 Lite 的專案,目的是顯著減少 V8 的記憶體使用量。起初,這項專案被構想為 V8 的一個獨立 輕量模式,專門針對低記憶體的行動裝置或注重記憶體使用而非執行速度的嵌入式案例。然而,在此期間,我們意識到許多為這個 輕量模式 開發的記憶體優化技術可以應用到常規的 V8,從而讓所有 V8 的使用者受益。
本文介紹了一種稱為_並行標記_的垃圾回收技術。此優化使 JavaScript 應用程式能在垃圾回收器掃描堆進行標記存活物件時繼續執行。基準測試顯示,並行標記可將主執行緒上的標記時間減少60%–70%。並行標記是Orinoco專案的最後一塊拼圖——該專案旨在逐步將舊的垃圾回收器替換為新的大部分並行和平行垃圾回收器。並行標記在 Chrome 64 和 Node.js v10中為預設啟用。
在 Chrome 66 中調試記憶體洩漏變得更容易。Chrome 的 DevTools 現在可以追蹤並快照 C++ DOM 物件,並顯示所有從 JavaScript 可達的 DOM 物件及其引用。這項功能是新 V8 垃圾回收器的 C++ 追蹤機制的一項優勢。
V8 中的 JavaScript 物件分配在由 V8 的垃圾收集器管理的堆上。在之前的博客文章中,我們已經討論了如何減少垃圾收集暫停時間(多次)和記憶體消耗。在這篇博客文章中,我們介紹了平行 Scavenger,Orinoco,V8 主要併發和平行垃圾收集器的一項最新功能,並討論了我們在過程中實現的設計決策和替代方法。
V8 對其堆大小有硬性限制。這充當了防止有記憶體洩漏的應用程序的保險機制。當應用程序達到此硬性限制時,V8 會執行一系列最後的垃圾回收。如果垃圾回收無法釋放記憶體,V8 停止執行並報告記憶體不足錯誤。沒有硬性限制的話,有記憶體洩漏的應用程序可能耗盡所有系統記憶體,損害其他應用程序的效能。
記憶體使用是 JavaScript 虛擬機性能權衡空間中的重要維度。在過去幾個月中,V8 團隊分析並顯著減少了若干被認為是現代網頁開發模式代表性網站的記憶體佔用量。在這篇博客中,我們呈現了分析所使用的工作負載和工具,概述了垃圾回收器中的記憶體優化,並展示了我們如何減少 V8 解析器及其編譯器所使用的記憶體。