close

作者 | 閆園園

上周,Facebook 母公司 Meta 宣布了開源 MemLab,一個用於在基於 Chromium 的瀏覽器上的 JavaScript 應用程序中查找內存泄漏的工具。Facebook 技術團隊指出:「應用程序的性能和功能正確性問題通常會被用戶立即留意到。然而內存泄漏卻不一樣,它不容易被立即察覺,但它每次都會吃掉一大塊內存,使得整個網絡會話的響應變得非常慢。」

為了幫助開發人員解決這個問題,Meta 構建了 MemLab,它可以自動進行內存泄漏檢測並更容易找到泄漏的根本原因。據公告稱,Meta 內部使用它成功地控制了不可持續的內存增長,並識別了產品和基礎設施中的內存泄漏和內存優化機會。目前,Meta 已經在 GitHub 上開源了 MemLab,「我們希望它能為 JavaScript 社區做出貢獻」。

為什麼開發 MemLab

2020 年,Facebook 技術團隊將 Facebook.com 重新設計為單頁應用程序(SPA),該應用程序的大部分渲染和導航使用客戶端 JavaScript。除此之外,Meta 其他大流行網絡應用程序也都使用了類似的架構來構建,包括 Instagram 和 Workplace。

公告表示,雖然這種架構使其能夠提供更快的用戶交互、更好的開發人員體驗,但內存泄漏的後果在單頁應用程序(SPA)中更為嚴重,因為用戶可能會在較長時間內持續與頁面交互,而 MemLab 就是專為這種場景設計的。

在許多情況下,JavaScript 可能會泄漏內存。比如,Facebook 工程師 Liang Gong 和 Glenn Conner 就在公告中談到,當你向 Chrome 控制台發送一個對象時,Chrome 會對其進行隱藏引用,以防止它被收集。另外,auth0 工程師 Sebastian Peyrott 也曾談到,其他可能出現泄漏或未綁定內存增長的情況則與意外使用全局變量、忘記計時器或回調以及 DOM 外引用有關。

雖然 Chrome 開發者工具提供了檢查 JavaScript 代碼的內存行為的基本手段,比如時間線視圖和配置文件視圖,但這並不直接,也不能自動化。相反,MemLab 則可以很容易地集成到 CI/CD 管道中,Gong 和 Conner 介紹道。

MemLab 工作原理

MemLab 的工作原理是通過預定義的測試場景運行 headless 瀏覽器並對 JavaScript heap snapshots 進行差異分析來發現內存泄漏。此過程工作過程如下:

導航到頁面並返回;

查找未釋放的對象;

顯示泄露追蹤結果。

據悉,MemLab 使用了一個名為「Puppeteer」的 Node.js 庫。它可以控制 Google Chrome 或其它基於 Chromium 內核打造的瀏覽器,且默認情況下以 headless 模式運行(方便命令行交互)。

MemLab 的另一特性,就是提供了 JavaScript 堆的圖形視圖、啟用了用於檢查堆快照的 API 。這意味着開發者能夠編寫開展內存斷言的測試,例如聲明某個對象將不再存在於內存中。

此外還有一個用於查找重複字符串實例的工具,在某個案例中,團隊發現字符串占用了 70% 的堆、且其中半數至少有一個重複的實例。包括 Chrome、Edge、Firefox 在內的瀏覽器,都有附帶內存檢查工具。但正如以為開發者在 Hacker News 上吐槽的那樣,這些開發工具難以在調試過程中揪出內存泄露的問題。

安裝方面,MemLab 不僅可以通過 npm 包管理器、還可從 git 存儲庫進行構建。不過 Windows 平台必須使用 Git Bash,否則會在構建時遭遇失敗。然後開發者可以運行 MemLab,將其傳遞給 JavaScript 文件中定義的場景。

最後,MemLab 的另一項強大功能,就是可以在測試期間作為命令過程的一部分而運行。這意味着如果代碼中引入了嚴重的泄露,開發者們也能夠在投入生產環境前加以捕獲。

目前,Facebook 應用 MemLab 已經幾年的時間了。公告也提到,在 2021 年上半年應用 MemLab 也將 Facebook.com 上的 OOM 崩潰減少了 50%。

參考鏈接:

https://engineering.fb.com/2022/09/12/open-source/memlab/

https://www.infoq.com/news/2022/09/memlab-javascript-memory-leaks/

https://www.cnbeta.com/articles/tech/1316541.htm

本周薦文

Adobe收購Figma;易聯購預售iPhone捲款跑路;脈脈以曠工為由辭退員工,被判賠24萬;Meta開源MemLab

用於VS Code的Edge開發工具擴展太強了,因此我放棄了Chrome

從零開始的新跨平台瀏覽器:Ladybird 正式起飛

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()