个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🎨100个小功能 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

文章目录

    • 内存泄漏
      • 意外的全局变量
      • 没有控制好的闭包
      • DOM 泄漏
    • 如何避免内存泄漏

内存泄漏

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因 程序未释放无法释放,造成 系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

意外的全局变量

如下所示代码,在 test() 回调函数中意外给全局变量赋了值。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><style>.main-content {margin-top: 100px;text-align: center;}#input {width: 200px;height: 50px;}#result {margin-top: 20px;font-size: 28;color: #2cc62c;}</style><body><div><input type="button" id="input" value="添加全局变量" /><div id="result"></div></div></body><script>const test = () => {for (let i = 0; i < 10000; i++) {this[`name${i}`] = i;}};const button = document.getElementById("input");button.addEventListener("click", function () {test();document.getElementById("result").innerHTML = "Done";});</script>
</html>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


没有控制好的闭包

这个例子中的问题是:

  1. 每次点击按钮,都会创建10000个闭包函数
  2. 这些闭包被存储在全局对象 obj 中
  3. 由于没有清理机制,每次点击都会累积更多的闭包,导致内存不断增长
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><style>.main-content {margin: auto;text-align: center;}#input {width: 200px;height: 50px;}#result {margin-top: 20px;font-size: 28;color: #2cc62c;}</style><body><div class="main-content"><input type="button" id="input" value="添加闭包" /><div id="result"></div></div></body><script>function fn() {return function () {return "hello";};}const obj = {};document.getElementById("input").addEventListener("click", function () {for (let i = 0; i < 10000; i++) {obj[`name${i}`] = fn();}document.getElementById("result").innerHTML = "Done";});</script>
</html>

在这里插入图片描述

DOM 泄漏

div 未被移除。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><style>#container {margin-top: 100px;text-align: center;}#result {margin-top: 20px;font-size: 28;color: #2cc62c;}</style><body><div id="container"><input id="add" type="button" value="add" /><input id="remove" type="button" value="remove" /><div id="wrapper"></div></div></body><script>const wrapper = document.getElementById("wrapper");const removeBtn = document.getElementById("remove");removeBtn.addEventListener("click",function () {const container = document.getElementById("container");container.removeChild(wrapper);},false);const addBtn = document.getElementById("add");addBtn.addEventListener("click",function () {const div = document.createElement("div");div.className = "result";div.innerHTML = "hello";wrapper.appendChild(div);},false);</script>
</html>

在这里插入图片描述


如何避免内存泄漏

  • 及时清除引用 :当不再需要闭包时,将其设置为null
  • 避免大对象 :不要在闭包中引用大型对象,如果必须使用,考虑在使用后解除引用
  • 使用弱引用 :在适当的场景使用WeakMap和WeakSet
  • 移除事件监听器 :当不再需要时,使用removeEventListener移除事件监听器
  • 清除定时器 :使用clearTimeout或clearInterval清除不再需要的定时器
  • 实现缓存过期机制 :对于缓存的闭包,实现LRU或过期时间机制
  • 避免循环引用 :检查并避免闭包中的循环引用
  • 使用开发工具 :利用Chrome DevTools的Memory面板定期检查内存使用情况

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!

参考资料:

  1. 百度 · 百科
  2. DeepSeek:DeepSeek
  3. Trae · GPT
  4. 内存泄漏

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915509.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915509.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915509.shtml

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

相关文章

部署zabbox企业级分布式监控

目录 一、监控系统的基础认知 2.1 监控的定义与核心价值 2.2 监控的五大类型与五层逻辑架构 &#xff08;1&#xff09;五大监控类型 &#xff08;2&#xff09;五层逻辑架构 2.3 主流开源监控产品对比 二、Zabbix 系统深度解析 3.1 Zabbix 的定位与发展历程 3.2 Zabb…

时空数据可视化新范式:基于Three.js的生产全流程时间轴回溯技术解析

内容摘要在现代工业生产中&#xff0c;如何高效地管理和分析生产全流程数据是一个关键问题。传统的数据可视化方法往往只能展示静态的数据快照&#xff0c;难以捕捉和回溯生产过程中的动态变化。然而&#xff0c;基于 Three.js 的时间轴回溯技术为这一难题提供了一种全新的解决…

宝塔面板Nginx报错: IP+端口可以直接从访问,反向代理之后就504了 Gateway Time-out

原因表示代理服务器在等待上游服务器&#xff08;即后端服务&#xff09;响应时超时 &#xff1a;<html><head><title>504 Gateway Time-out</title> </head><body><center><h1>504 Gateway Time-out</h1></center&g…

【ComfyUI学习笔记01】下载安装 | 运行第一个工作流 | 学习思路

【ComfyUI学习笔记01】下载安装 | 运行第一个工作流 | 学习思路前言下载安装ComfyUI的下载和安装ComfyUI Manager 的下载和安装运行第一个工作流初识节点 (Nodes) 工作流案例1 Image Generation绘制流程图&#xff0c;确定关键节点放置关键节点&#xff0c;确定连接顺序补充中间…

numpy库的基础知识

一.numpy是什么 &#xff1f;Numpy 是 Python 中专门用于高性能数值计算的库&#xff0c;其核心是一个功能强大的 n 维数组对象&#xff08;ndarray&#xff09;&#xff0c;可以用来存储和操作大规模的数字矩阵或张量数据。numpy库的作用&#xff1a;核心功能&#xff1a;实现…

在UniApp中防止页面上下拖动的方法

1、pages.json中在某个页面设置禁用弹性滚动的页面 {"path": "pages/yourPage/yourPage","style": {"app-plus": {"bounce": "none"}} } 2、 pages.json中在所有页面设置禁用弹性滚动的页面 {"globalStyl…

LinkedList的模拟实现(双向链表Java)

一&#xff1a;结构LinkedList的底层是双向链表结构(链表后面介绍)&#xff0c;由于链表没有将元素存储在连续的空间中&#xff0c;元素存储在单独的节点中&#xff0c;然后通过引用将节点连接起来了&#xff0c;因此在在任意位置插入或者删除元素时&#xff0c;不需要搬移元素…

Shopify 知识点

&#x1f4dc; 一、Liquid模板语言&#xff08;核心基础&#xff09;语法结构 • 输出变量&#xff1a;{{ product.title }} 动态显示商品标题。 • 逻辑控制&#xff1a;{% if product.available %}…{% endif %} 条件渲染。 • 循环遍历&#xff1a;{% for item in collectio…

Web LLM 安全剖析:以间接提示注入为核心的攻击案例与防御体系

文章目录1 间接提示注入2 训练数据中毒为什么会出现这种漏洞&#xff1f;3 泄露敏感训练数据攻击者如何通过提示注入获取敏感数据&#xff1f;为什么会出现这种泄露&#xff1f;4 漏洞案例间接提示注入利用 LLM 中的不安全输出处理5 防御 LLM 攻击把LLM能访问的API当成“公开接…

ElasticSearch:不停机更新索引类型(未验证)

文章目录**一、前期准备****1. 集群健康检查****2. 备份数据****3. 监控系统准备****二、创建新索引并配置****1. 设计新索引映射****2. 创建读写别名****三、全量数据迁移****1. 执行初始 Reindex****2. 监控 Reindex 进度****四、增量数据同步****1. 方案选择****五、双写切换…

python学智能算法(二十七)|SVM-拉格朗日函数求解上

【1】引言 前序学习进程中&#xff0c;我们已经掌握了支持向量机算法中&#xff0c;为寻找最佳分割超平面&#xff0c;如何用向量表达超平面方程&#xff0c;如何为超平面方程建立拉格朗日函数。 本篇文章的学习目标是&#xff1a;求解SVM拉格朗日函数。 【2】求解方法 【2.…

mac安装node的步骤

适用于macOS 10.15及以上版本。 前提条件 macOS版本&#xff1a;确保系统为macOS 10.15&#xff08;Catalina&#xff09;或更高版本。可在“苹果菜单 > 关于本机”查看。管理员权限&#xff1a;部分安装可能需要管理员权限。网络连接&#xff1a;需要联网下载安装包或工具…

【LeetCode数据结构】栈的应用——有效的括号问题详解

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为…

多尺度卷积模型:Inception块

在GoogLeNet中&#xff0c;基本的卷积块被称为Inception块&#xff08;Inception block&#xff09;。 使用窗口大小为11&#xff0c;33&#xff0c;551\times1&#xff0c;3\times3&#xff0c;5\times511&#xff0c;33&#xff0c;55的卷积层&#xff0c;从不同空间大小中提…

Android 默认图库播放视频没有自动循环功能,如何添加

Android 默认图库播放视频没有自动循环功能, 如何添加 按如下方式添加 开发云 - 一站式云服务平台 .../apps/Gallery2/res/values-zh-rCN/strings.xml | 3 ++ packages/apps/Gallery2/res/values/strings.xml | 3 ++ .../com/android/gallery3d/app/MovieActivity…

7月21日总结

命令执行 RCE RCE&#xff08;remote code execute&#xff09;&#xff1a;远程命令执行或者代码执行&#xff0c;我们平时说的rce&#xff0c;比如thinkPHP的 rce漏洞&#xff0c;即算代码注入漏洞&#xff0c;也算rce漏洞&#xff0c;因为渗透的最终情况可以实现执行命令或…

Linux——自制shell命令行解释器

文章目录1.打印命令提示符2.获取用户输入指令3.重定向分析4.命令行参数表,环境变量表,初始化5.命令解析6.命令执行6.1.创建子进程6.2 处理内建命令6.3 文件重定向7.源码前言 在实现shell的时候我们先创建自己myshell目录&#xff0c;在目录中创建myshell.cc文件&#xff0c;因…

Boost库智能指针boost::shared_ptr详解和常用场景使用错误示例以及解决方法

1、Boost智能指针 —— boost::shared_ptr 详解一、什么是 boost::shared_ptr boost::shared_ptr 是 Boost 库中实现的一个智能指针模板类&#xff0c;用于管理动态分配的对象生命周期&#xff0c;采用引用计数机制。多个 shared_ptr 实例可以共享同一个对象的所有权&#xff0…

科学分析指南,如何快速找到并清理磁盘的无用文件

随着时间的推移&#xff0c;系统中会积累大量的临时文件、缓存文件、不再需要的安装包或其他大型文件。磁盘清理可以删除这些不必要的文件&#xff0c;从而释放宝贵的磁盘空间。它无需安装&#xff0c;插上 U 盘就能直接使用。只需勾选需要扫描的磁盘&#xff0c;点击“开始分析…

Laravel 系统版本查看及artisan管理员密码找回方法针对各个版本通用方法及原理-优雅草卓伊凡

Laravel 系统版本查看及artisan管理员密码找回方法针对各个版本通用方法及原理-优雅草卓伊凡一、查看 Laravel 版本的方法优雅草蜻蜓T会议系统专业版 最近又有客户要了&#xff0c;但是发现 密码不对 管理员账户密码不对&#xff0c;卓伊凡必须处理下&#xff0c;这里顺便讲解密…