文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Memlab,一款分析 JavaScript 堆并查找浏览器和 Node.js 中内存泄漏的开源框架 原创 为少 黑客下午茶

2024-12-01 15:34

关注

Memlab 是 JavaScript 的内存测试框架。它支持定义一个测试场景(使用 Puppeteer API),教 Memlab 如何与您的单页应用程序(SPA)交互,Memlab 可以自动处理其余的内存泄漏检查:

安装 Memlab

npm install -g memlab
memlab help

在 Demo App 中检测泄漏

使用 Memlab 检测分离的 DOM 元素的教程。Demo 源码:

https://github.com/facebookincubator/memlab/tree/main/packages/e2e/static/example

设置示例 Web App

当您单击 “Create detached DOMs” 按钮时,Demo app 会泄漏分离的 DOM 元素。每次单击都会创建 1024 个分离的 DOM 元素,这些元素由 window 对象引用。

// @nolint

import Link from 'next/link';
import React from 'react';

export default function DetachedDom() {

const addNewItem = () => {
if (!window.leakedObjects) {
window.leakedObjects = [];
}
for (let i = 0; i < 1024; i++) {
window.leakedObjects.push(document.createElement('div'));
}
console.log('Detached DOMs are created. Please check Memory tab in devtools')
};

return (
<div className="container">
<div className="row">
<Link href="/">Go backLink>
div>
<br />
<div className="row">
<button type="button" className="btn" onClick={addNewItem}>
Create detached DOMs
button>
div>
div>
);
}

源文件:packages/e2e/static/example/pages/examples/detached-dom.jsx

1. 克隆仓库

要在本地机器上运行 demo,请克隆 memlab github 存储库:

https://github.com/facebookincubator/memlab

git clone git@github.com:facebookincubator/memlab.git

2. 运行示例 App

从 Memlab 项目的根目录运行以下命令:

cd packages/e2e/static/example
npm install
npm run dev

这将启动一个示例 Nextjs app。让我们通过从浏览器访问 http://localhost:3000 来确保它正在运行:

这里测试的是 Example 1。

查找内存泄漏

1.创建一个场景文件

// @nolint
// memlab/packages/e2e/static/example/scenario/detached-dom.js

function url() {
return "http://localhost:3000/examples/detached-dom";
}


async function action(page) {
const elements = await page.$x(
"//button[contains(., 'Create detached DOMs')]"
);
const [button] = elements;
if (button) {
await button.click();
}
// 从 memlab 清理外部引用
await Promise.all(elements.map(e => e.dispose()));
}


async function back(page) {
await page.click('a[href="/"]');
}

module.exports = { action, back, url };

这个文件在 packages/e2e/static/example/scenario/detached-dom.js。

2.运行 memlab

这可能需要几分钟:

cd packages/e2e/static/example
npm run dev # 注意启动 Demo
memlab run --scenario scenarios/detached-dom.js

3.调试泄漏跟踪

对于每个泄漏的对象组,memLab 打印一个具有代表性的泄漏跟踪。

让我们从上到下分解结果:

第 1 部分:浏览器交互面包屑显示了按照我们的场景文件中指定的方式执行的浏览器交互(导航)memlab。

第 2 部分:泄漏跟踪的总体摘要

第 3 部分:每个泄漏簇的详细代表泄漏跟踪

map - 这是正在访问的对象的 V8 HiddenClass(V8 在内部使用它来存储有关对象形状的元信息和对其原型的引用 - 在此处查看更多信息)- 在大多数情况下,这是 V8 实现细节,可以忽略。

https://v8.dev/blog/fast-properties#hiddenclasses-and-descriptorarrays

prototype - 这是 Window 类的实例。

leakedObjects - 这表明 leakedObjects 是 Window 对象的一个属性,大小为 148.5KB,指向一个 Array 对象。

0 - 这表明分离的 HTMLDIVElement(即当前未连接到 DOM 树的 DOM 元素)被存储为leakedObjects 数组的第一个元素(由于显示所有 1024 条泄漏痕迹是压倒性的,Memlab 只打印一个具有代表性的泄漏痕迹。即属性 0 而不是属性 0->1023)

简而言之,从 Window 对象到泄漏对象的泄漏跟踪路径为:

[window](object) -> leakedObjects(property) -> [Array](object)
-> 0(element) -> [Detached HTMLDIVElement](native)

与示例中的泄漏代码匹配:

window.leakedObjects = [];
for (let i = 0; i < 1024; i++) {
window.leakedObjects.push(document.createElement('div'));
}


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯