当前位置: 首页 > ai >正文

【前端】如何检查内存泄漏

在实际的场景中,如果观察到内存持续出现峰值,并且内存消耗一直没有减少,那可能存在内存泄漏。
使用 Chrome DevTools 来识别内存图和一些内存泄漏,我们需要关注以下两个方面:
● 使用性能分析器可视化内存消耗;
● 识别分离的 DOM 节点。
(1)使用性能分析器可视化内存消耗
以下面的代码为例,

<!DOCTYPE html>
<html lang="en"><head><title>Memory leaks</title></head><body><button id="print">打印</button><button id="clear">清除</button></body>
</html>
<script>var longArray = [];function print() {for (var i = 0; i < 10000; i++) {let paragraph = document.createElement("p");paragraph.innerHTML = i;document.body.appendChild(paragraph);}longArray.push(new Array(1000000).join("y"));}document.getElementById("print").addEventListener("click", print);document.getElementById("clear").addEventListener("click", () => {window.longArray = null;document.body.innerHTML = "Cleared";});
</script>

有两个按钮:打印和清除。点击“打印”按钮,通过创建 paragraph 节点并将大字符串设置到全局,将1到10000的数字追加到DOM中。
“清除”按钮会清除全局变量并覆盖 body 的正文,但不会删除单击“打印”时创建的节点
在这里插入图片描述
当每次点击打印按钮时,JavaScript Heap都会出现蓝色的峰值,并逐渐增加,这是因为JavaScript正在创建DOM节点并字符串添加到全局数组。当点击清除按钮时,JavaScript Heap就变得正常了。 除此之外,可以看到节点的数量(绿色的线)一直在增加,因为我们并没有删除这些节点。
(2)识别分离的 DOM 节点
当一个节点从 DOM 树中移除时,它被称为分离,但一些 JavaScript 代码仍然在引用它。让我们使用下面的代码片段检查分离的 DOM 节点。通过单击按钮,可以将列表元素添加到其父级中并将父级分配给全局变量。简单来说,全局变量保存着 DOM 引用。

var detachedElement;
function createList(){let ul = document.createElement("ul");for(let i = 0; i < 5; i++){ul.appendChild(document.createElement("li"));}detachedElement = ul;
}
document.getElementById("createList").addEventListener("click", createList);

使用 heap snapshot 来检查分离的DOM节点,可以在Chrome DevTools 的Memory面板中打开Heap snapshots选项:点击下面蓝色的Take snapshot按钮,我们可以在中间的搜索栏目输入Detached来过滤结果以找到分离的DOM节点,如下所示:
4951abb59e8f706c8873b8a801112aa2.png

http://www.xdnf.cn/news/1851.html

相关文章:

  • 中国250米土壤质地类型数据
  • 上海SMT贴片加工核心工艺与优化方案
  • 文档编辑:reStructuredText全面使用指南 — 第四部分 高级主题
  • 自然语言处理将如何颠覆未来教育?个性化学习新纪元
  • 潮了 低配电脑6G显存生成60秒AI视频 本地部署/一键包/云算力部署/批量生成
  • aws(学习笔记第三十九课) iot-msk-pipeline
  • 【开源工具】Python打造高颜值串口调试助手:支持自动收发+历史记录+多主题切换(附完整源码)
  • 不会挖竞品关键词?你每天都在浪费 50% 的 SEO 预算!
  • Linux的基础指令
  • 实战指南:搭建智慧变电站管理平台全流程解析(二)
  • Flutter Dart中的函数参数 默函数的定义 可选参数 箭头函数 匿名函认参数 命名参类数 闭包等
  • 第八章.干货干货!!!SpringAI手撸MCP服务
  • C++ 的 trivially relocatable
  • 解决ssh拉取服务器数据,要多次输入密码的问题
  • PyTorch 实现食物图像分类实战:从数据处理到模型训练
  • 植物合成生物学:上帝之手,万物皆可合
  • 【MQ篇】RabbitMQ的消费者确认机制实战!
  • 【金仓数据库征文】金仓数据库:开启未来技术脑洞,探索数据库无限可能
  • 脚本批量启动Node服务器
  • 【金仓数据库征文】_AI 赋能数据库运维:金仓KES的智能化未来
  • 复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航
  • 计算机组成原理第二章 数据的表示和运算——2.1数制与编码
  • HTMLcss实现网站抽奖
  • Ubuntu 下 Nginx 1.28.0 源码编译安装与 systemd 管理全流程指南
  • 本地使用Ollama部署DeepSeek
  • 30天通过软考高项-第三天
  • redis 数据类型新手练习系列——string类型
  • 【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
  • 计算机组成原理-408考点-数的表示
  • 全面解析 MCP(Model Context Protocol):AI 大模型的“万能连接器”