Meta 开源 MemLab:JavaScript 内存泄漏检测工具


Meta 宣布开源了 MemLab,一个用于在基于 Chromium 的浏览器上的 JavaScript 应用程序中查找内存泄漏的工具。公告称,找到并解决内存泄漏的根本原因对于在 Web 应用程序上提供高质量的用户体验非常重要。MemLab 帮助 Meta 的工程师和开发人员改善了用户体验,并在内存优化方面做出了重大改进。“我们希望它也能为更大的 JavaScript 社区做出贡献”。

Facebook.com 在 2020 年被重新设计为单页应用程序 (SPA),该应用程序的大部分渲染和导航使用客户端 JavaScript。而 Meta 的大多数其他流行网络应用程序都使用了类似的架构来构建,包括 Instagram 和 Workplace。该公司表示,虽然这种架构使其能够提供更快的用户交互、更好的开发人员体验和更像应用程序的感觉,但在客户端维护 Web 应用程序状态会使有效管理客户端内存变得更加复杂。

“使用我们的网络应用程序的人通常会立即注意到性能和功能正确性问题。然而,内存泄漏是另一回事;它不会立即被察觉,因为它一次会占用一大块内存——影响整个 Web 会话并使后续交互变得更慢且响应更慢。为了帮助我们的开发人员解决这个问题,我们构建了MemLab,这是一个 JavaScript 内存测试框架,它可以自动进行泄漏检测并更容易找到内存泄漏的根本原因。我们在 Meta 使用 MemLab 成功地控制了不可持续的内存增长,并识别了我们产品和基础设施中的内存泄漏和内存优化机会。我们已经在 GitHub 上开源了 MemLab,我们很高兴能与 JavaScript 社区合作,让开发人员从今天开始使用 MemLab。”

MemLab 的工作原理是通过预定义的测试场景运行 headless 浏览器并对 JavaScript heap snapshots 进行差异分析来发现内存泄漏。此过程分六个步骤进行:

  • 浏览器交互

  • 区分 heap
  • 细化内存泄漏列表
  • 生成 retainer traces
  • Clustering retainer traces
  • 报告泄漏

MemLab 提供内存泄漏检测功能。对于浏览器内存泄漏检测,MemLab 需要开发人员提供的唯一输入是一个测试场景文件,该文件定义了如何通过 overriding Puppeteer API 和 CSS 选择器的三个回调来与网页进行交互。MemLab 会自动对 JavaScript heap 进行差异化处理,完善内存泄漏,并对结果进行汇总。

MemLab 的另一个特性是提供了“JavaScript heap Graph-view API”。Node.js 程序或 Jest test 也可以使用 graph-view API 来获取其自身状态的 heap graph view,进行 self-memory 检查,并编写各种内存断言。除了内存泄漏检测,MemLab 还包括一组内置的 CLI 命令和 API,用于寻找内存优化机会。

通过使用 MemLab 检测和诊断内存泄漏,Meta 方面称,其在 2021 年上半年将 Facebook.com 上的 OOM 崩溃减少了 50%。

更多详情可查看官方博客。


相關推薦

2022-08-20

通过使用应用内网络浏览器(in-app web browser)和注入的 JavaScript 代码来跟踪用户数据,能够获得的数据包括访问的网站、屏幕点击、键盘输入,以及文本选择等内容。 除了 Meta,之后 Felix Krause 还发现 TikTok 也会采用类似的方式

2023-11-05

集成了JavaScript运行时、打包器、转译器和包管理器于一身的 Bun 发布了1.0.8版本。在这次更新中,Bun 团队修复了138个错误,并获得了257个来自社区的👍。这不仅体现了Bun团队对社区需求的重视,也展示了Bun作为一个开源项目的

2024-01-18

个兼具运行时、打包工具、转译器和包管理器多重功能的JavaScript工具,在日前迎来了1.0.23版本的更新。本次更新针对社区反馈修复了40个bug,共计获得了194个赞。更新使Bun在打包部署等方面的易用性有所提升。 引入SQLite数据库

2023-06-20

PartialPageUpdate 顺序使 IListener.onAfterResponde 忽略了 prepended javascript [WICKET-6913] - Java 17 与 cglib 的兼容性 [WICKET-6914] - 通过 ajax 更改“File Upload”的可见性导致“丢失”表单数据 [WICKET-6921] - MultipartFormComponentListener 在隐藏组件上

2023-04-15

递归 AST 评估中的 use-after-free。 修复了错误 GH-8646(内存泄漏 PHP FPM 8.1)。 重新添加一些被错误地从 CTE 中移除的 CTE 函数。 从错误添加的 array_diff_ukey() 中删除 CTE flag。 修复了错误 GH-10801(CTE 函数中的命名参数导

2023-03-17

x86、arm64 等架构。 在应用开发方面,支持 C/C++、Java、JavaScript、Ruby、GO、Python、PHP 等主流的开发语言。 总结 openGemini 具备卓越的读写性能和高效的数据分析能力,支持单机和集群,部署形式多样,可边缘、可云、可物理

2023-04-02

ust的内存安全和并发性、Python的易用性和快速开发、以及JavaScript的动态性和灵活性等。这种综合特性使得开发人员能够更好地处理复杂的编程任务。 自动化内存管理:NGPTL++ 编程语言采用自动化内存管理机制,使得开发人员

2022-03-14

的。当用户通过 Web 端来使用 WhatsApp 时,他们使用的是 Javascript,这意味着在技术上进行篡改是可行的。而 Code Verify 扩展为 Web 端带来了相同的保护,它会扫描基于 Web 的应用程序的 Javascript 代码,并确保它与来源相匹配。 Meta

2022-04-15

tHub 上开源了一个名为 Lexical 的项目,该项目是一个基于 JavaScript 的 Web 文本编辑器框架,具有可扩展、可访问和高性能的特性。Meta 在介绍中表示,结合 Lexical 高度可扩展的架构,开发者可以构建在大小和功能上均可以扩展的独

2023-10-26

Bun Bun 是采用 Zig 语言编写的高性能 “全家桶” JavaScript 运行时,官方称其为 "all-in-one JavaScript runtime"。Bun 提供了打包、转译、安装和运行 JavaScript & TypeScript 项目的功能,内置原生打包器 (native bundler)、转译器、t

2023-10-23

I!>>> Bun是一个集打包工具、转译器和包管理器于一体的JavaScript运行时,由Jarred Sumner于2023年10月20日发布了1.0.7版本。本次更新实现了对Node.js运行时的多项兼容性改进,并修复了近60个bug。 根据发布说明,本版本对“bun install

2022-07-23

Deno 是一个简单、现代和安全的 JavaScript 和 TypeScript 的运行时,它使用 V8 并以 Rust 构建。 Deno 1.24 已发布,值得关注的更新包括: 类型检查和发射的性能改进 以前,当指定 --check 标志时,Deno 内部使用 TypeScript 编译器将 TypeScri

2022-08-22

DBeaver 是一个免费开源的通用数据库工具,适用于开发人员和数据库管理员。 DBeaver 22.1.5 现已发布,更新内容如下: SQL editor:脚本连接关联问题已修复 Data editor: Data editor 中的主要内存泄漏已修复 分组面板清理问题

2023-05-14

itions 会被意外地剪除。 修复 memoize plan execution 中的内存泄漏。 修复在执行分批插入时使用分区的外域表的缓冲区 refcount 泄漏。 恢复对 sub-millisecondvacuum_cost_delay设置的支持。 视图和规则的几个修复 。 在使用