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

在实际的场景中,如果观察到内存持续出现峰值,并且内存消耗一直没有减少,那可能存在内存泄漏。
使用 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.mzph.cn/bicheng/78595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript的JSON处理Map的弊端

直接使用 Map 会遇到的问题及解决方案 直接使用 Map 会导致数据丢失&#xff0c;因为 JSON.stringify 无法序列化 Map。以下是详细分析及解决方法&#xff1a; 问题复现 // 示例代码 const myMap new Map(); myMap.set(user1, { name: Alice }); myMap.set(user2, { name: B…

【数据结构】第五弹——Stack 和 Queue

文章目录 一. 栈(Stack)1.1 概念1.2 栈的使用1.3 栈的模拟实现1.3.1 顺序表结构1.3.2 进栈 压栈1.3.3 删除栈顶元素1.3.4 获取栈顶元素1.3.5 自定义异常 1.4 栈的应用场景1.改变元素序列2. 将递归转化为循环3. 四道习题 1.5 概念分区 二. 队列(Queue)2.1 概念2.2 队列的使用2.3…

第七届能源系统与电气电力国际学术会议(ICESEP 2025)

重要信息 时间&#xff1a;2025年6月20-22日 地点&#xff1a;中国-武汉 官网&#xff1a;www.icesep.net 主题 能源系统 节能技术、能源存储技术、可再生能源、热能与动力工程 、能源工程、可再生能源技术和系统、风力发…

深入解析C++ STL Stack:后进先出的数据结构

一、引言 在计算机科学中&#xff0c;栈&#xff08;Stack&#xff09;作为一种遵循后进先出&#xff08;LIFO&#xff09;​原则的数据结构&#xff0c;是算法设计和程序开发的基础构件。C STL中的stack容器适配器以简洁的接口封装了底层容器的操作&#xff0c;为开发者提供了…

Golang | 自行实现并发安全的Map

核心思路&#xff0c;读写map之前加锁&#xff01;哈希思路&#xff0c;大map化分为很多个小map

Mac 「brew」快速安装MySQL

安装MySQL 在 macOS 上安装 MySQL 环境可以通过Homebrew快速实现&#xff0c;以下是步骤指南&#xff1a; 方法 1&#xff1a;使用 Homebrew 安装 MySQL 1. 安装 Homebrew 如果尚未安装 Homebrew&#xff0c;可以通过以下命令安装&#xff1a; /bin/bash -c "$(curl -…

【数字孪生世界的搭建之旅:从0到1理解飞渡平台】

数字孪生世界的搭建之旅&#xff1a;从0到1理解飞渡平台 前言&#xff1a;数字分身的魔法 想象一下&#xff0c;如果你能在现实世界之外&#xff0c;创造一个物理世界的"分身"&#xff0c;这个分身能完美复制现实中的一切变化&#xff0c;甚至可以预测未来可能发生…

【漏洞复现】Struts2系列

【漏洞复现】Struts2系列 1. 了解Struts21. Struts2 S2-061 RCE &#xff08;CVE-2020-17530&#xff09;1. 漏洞描述2. 影响版本3. 复现过程 1. 了解Struts2 Apache Struts2是一个基于MVC设计模式的Web应用框架&#xff0c;会对某些标签属性&#xff08;比如 id&#xff09;的…

[FPGA Video IP] Video Processing Subsystem

Xilinx Video Processing Subsystem IP (PG231) 详细介绍 概述 Xilinx LogiCORE™ IP Video Processing Subsystem (VPSS)&#xff08;PG231&#xff09;是一个高度可配置的视频处理模块&#xff0c;设计用于在单一 IP 核中集成多种视频处理功能&#xff0c;包括缩放&#xf…

自动驾驶(ADAS)功能--相关名称及缩写

根据《道路车辆先进驾驶辅助系统&#xff08;ADAS&#xff09;术语及定义》GB/T 39263—2020&#xff0c;如下表格&#xff1a; 编号中文术语英文缩写定义类别2.1.1先进驾驶辅助系统ADAS利用传感、通信、决策及执行等装置&#xff0c;实时监测驾驶员、车辆及行驶环境&#xff…

1.9软考系统架构设计师:优秀架构设计师 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析

超简记忆要点 1. 优秀架构师标准 ✅ 技术&#xff08;深度/广度&#xff09; 实战&#xff08;大型项目&#xff09; 素养&#xff08;沟通/业务前瞻&#xff09; 2. 演化路径 &#x1f4c8; 积累&#xff08;技术/项目&#xff09; → 思维&#xff08;系统视角/抽象建模&…

(MySQL)库的操作

目录 创建数据库 语法 创建数据库实例 不使用可选项 使用可选项1 字符集和校验规则 校验规则对数据库的影响 不区分大小写 查看配置 添加可选项2 操纵数据库 使用数据库 查看数据库 查看所有数据库 查询当前正在使用的数据库名称 显示创建数据库语句 修改数据库…

10.ArkUI Grid的介绍和使用

ArkUI Grid 组件详解与使用指南 Grid 是 ArkUI 中用于实现网格布局的容器组件&#xff0c;能够以行和列的形式排列子组件。以下是 Grid 组件的详细介绍和使用方法。 基本介绍 Grid 组件特点&#xff1a; 支持固定列数和自适应布局提供灵活的间距和排列控制支持滚动显示大量…

目标检测原理简介

目标检测是一类计算机视觉任务,简单来说,目标检测可被定义为在计算机中输入一张图像,计算机需要找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,如图一所示。目标检测是计算机视觉领域的核心问题之一,相较于最原始的将整张图片分类为某一类别,目标检测不光可…

ZYNQ笔记(十四):基于 BRAM 的 PS、PL 数据交互

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 实验任务&#xff1a; PS 将字符串数据写入BRAM&#xff0c;再将数据读取出来&#xff1b;PL 从 BRAM 中读取数据&#xff0c;bing。通过 ILA 来观察读出的数据&#xff0c;与前面串口打印的数据进行对照&#xff0…

Python-Django系列—部件

部件是 Django 对 HTML 输入元素的表示。部件处理 HTML 的渲染&#xff0c;以及从对应于部件的 GET&#xff0f;POST 字典中提取数据。 内置部件生成的 HTML 使用 HTML5 语法&#xff0c;目标是 <!DOCTYPE html>。例如&#xff0c;它使用布尔属性&#xff0c;如 checked…

【Leetcode 每日一题】2799. 统计完全子数组的数目

问题背景 给你一个由 正 整数组成的数组 n u m s nums nums。 如果数组中的某个子数组满足下述条件&#xff0c;则称之为 完全子数组 &#xff1a; 子数组中 不同 元素的数目等于整个数组不同元素的数目。 返回数组中 完全子数组 的数目。 子数组 是数组中的一个连续非空序…

卷积神经网络(二)

1 卷积运算的两个问题&#xff1a; 1.1 图像边缘信息使用少 边缘的像素点可能只会被用一次或者2次&#xff0c;中间的会用的更多。 1.2 图像被压缩 5*5的图像&#xff0c;如果经过3*3的卷积核后&#xff0c;大小变成3*3的。 N*N的图像&#xff0c;果经过F*F的卷积核后&#x…

组网技术-DHCP服务器,RIP协议,OSPF协议

1.DHCP Server提供三种IP地址分配策略&#xff1a; 手工分配地址 自动分配地址 n 动态分配地址 2.DHCP报文类型 DHCP DISCOVER(广播)&#xff1a;用于寻址DHCP Server DHCP OFFER&#xff08;单播&#xff09;&#xff1a;携带分配给客户端的IP地址 DHCP REQUEST&#xff08;…

反爬策略应对指南:淘宝 API 商品数据采集的 IP 代理与请求伪装技术

一、引言​ 在电商数据驱动决策的时代&#xff0c;淘宝平台海量的商品数据极具价值。然而&#xff0c;淘宝为保障平台安全和用户体验&#xff0c;构建了严密的反爬体系。当采集淘宝 API 商品数据时&#xff0c;若不采取有效措施&#xff0c;频繁的请求极易触发反爬机制&#x…