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

前端内存泄露案例与解决方案

什么是内存泄漏?
内存泄露(Memory Leaks):是指应用程序已经不再需要的内存,由于某种原因未返回给操作系统或者空闲内存池(Pool of Free Memory)。

内存泄露可能带来的问题:变慢、卡顿、高延迟。

内存泄漏的常见示例和防范

1.未能及时清除定时器

// 没去清除的定时器
setTimeout(this.someMethod, 1000)
setInterval(this.someMethod, 1000)
// 正确做法
this.timeout01 = setTimeout(this.someMethod, 1000)
this.interval01 = setInterval(this.someMethod, 1000)
// 在页面销毁的时候,及时清除
beforeDestroy() {this.timeout01 && clearTimeout(this.timeout01)this.interval01 && clearInterval(this.interval01)
}

2.未能及时取消事件的监听

bus.$on('aaa')
beforeDestroy() {// 在页面销毁的时候,及时取消监听bus.$off('aaa')
}

3.console.log 没有注释掉或在打包的时候没有清理掉造成泄漏
控制台日志记录对总体内存内置文件的影响,也是个重大的问题。记录错误的对象,可以将大量的数据保留在内存中。传递给console.log的对象是不能被垃圾回收,所以没有去掉console.log可能会存在内存泄漏

4.DOM创建造成内存泄漏

// 元素引用并没有清理
var a = document.getElementById('id');
document.body.removeChild(a);
// 不能回收,因为存在变量a对它的引用。虽然我们用removeChild移除了,但DOM元素还在内存里面。
解决方法: a = null;

5.变量没及时被清理,特别是对于数据量大的变量,要引起重视。
数据量过大:如果在VUE应用中处理了大量的数据,那么会导致内存占用较大。特别是在使用响应式数据时,当数据发生变化时,VUE会对其进行重新渲染,从而占用更多的内存。

methods: {fun1() {let a = [数据量可能会比较大的数组]let b = [数据量可能会比较大的数组]let c = [...a, ...b]this.fun2(c)// 此处应该用完就及时清理掉a = nullb = nullc = null},fun2(data) {// ......}
}

6.如果应用中包含了大量的组件,每个组件都有自己的状态和响应式数据,那么会占用更多的内存。特别是在动态创建和销毁组件时,需要频繁地创建和销毁组件实例,从而导致内存占用较大。
解决办法:组件懒加载-将组件按需加载,只在需要的时候才加载组件,而不是一次性加载所有组件。
以下拿弹窗组件举个例子

// 页面中引入多个弹窗组件
<编辑与新增的组件/>
<拍照的组件/>
<打印的组件/>
// 由于以上组件在页面初始化的时候,是用不到的,点击相应的按钮后才会打开弹窗,这时候最好是加一个v-if判断
<编辑与新增的组件 v-if="isOpen01"/>
<拍照的组件 v-if="isOpen02"/>
<打印的组件  v-if="isOpen03"/>
// 然后对于Element-ui的el-dialog弹窗组件,有个属性要利用起来,关闭时销毁 Dialog 中的元素:destroy-on-close="true"

在这里插入图片描述
7.过多的循环嵌套,或者通过for、forEach等循环处理过于复杂的数据时所定义的变量没及时清理,也会导致内存用量飙升或者内存泄露的问题。平时也要合理使用循环遍历,尽可能减少遍历的次数。

总之,在日常开发的时候,细心点,及时规避会导致内存泄露的代码,就能开发出健康稳健的项目。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Ubuntu 安装个人热点
  • 字符集介绍
  • 八、2 DMA数据转运 DMA函数介绍
  • 使用 streamlink 把 m3u8 转为 mp4
  • 如何使用IDEA搭建Mybatis框架环境(详细教程)
  • 什么是USB?
  • 前端配置环境
  • RabbitMQ 入门:基本概念、特性及简单示例
  • 开学季老师如何发布分班?
  • 奇偶校验、crc循环冗余检验
  • pg 唯一性约束修复
  • Go语言的编程规则和秘籍
  • dll高级技术--动态注入:ImgWalk动态库,这个DLL用来检测被注入的进程中当前载入的各个模块名称---DLL程序
  • 公安智慧大楼信息化整体建设设计方案
  • Web开发 Ajax 2024/3/31
  • [笔记] php常见简单功能及函数
  • 《深入 React 技术栈》
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • CSS 提示工具(Tooltip)
  • css的样式优先级
  • E-HPC支持多队列管理和自动伸缩
  • idea + plantuml 画流程图
  • leetcode388. Longest Absolute File Path
  • nfs客户端进程变D,延伸linux的lock
  • node和express搭建代理服务器(源码)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • swift基础之_对象 实例方法 对象方法。
  • vue-loader 源码解析系列之 selector
  • vuex 学习笔记 01
  • 安装python包到指定虚拟环境
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 从伪并行的 Python 多线程说起
  • 订阅Forge Viewer所有的事件
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端攻城师
  • 嵌入式文件系统
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 手机端车牌号码键盘的vue组件
  • 首页查询功能的一次实现过程
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小程序开发中的那些坑
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 阿里云重庆大学大数据训练营落地分享
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #NOIP 2014# day.2 T2 寻找道路
  • #VERDI# 关于如何查看FSM状态机的方法
  • #预处理和函数的对比以及条件编译
  • ${factoryList }后面有空格不影响
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (编译到47%失败)to be deleted
  • (独孤九剑)--文件系统
  • (剑指Offer)面试题34:丑数