浅谈内存泄漏

内存泄漏

概念

在JavaScript中,内存泄漏是指应用程序在不再需要使用某块内存时仍然保持对其的引用,导致内存不能被垃圾回收机制释放,最终导致内存占用过高,性能下降。

内存泄漏通常发生在以下情况:

  • 全局变量:全局变量会一直存在于内存中,即使在不需要时也无法被垃圾回收机制回收。
    未清理的定时器和回调函数:如果定时器或回调函数没有正确清理,它们将一直存在于内存中,即使它们已经完成或不再需要了。
  • DOM引用:当从DOM中删除元素时,如果仍然保持对该元素的引用,它将会在内存中留下无法释放的引用。
  • 闭包:如果函数创建了一个闭包(即函数内部引用了外部函数的变量),并且闭包没有在正确的时机释放,这将导致外部函数的变量一直无法被垃圾回收。

为了避免内存泄漏,可以采取以下措施:

  • 使用局部变量:在函数内部尽量使用局部变量而不是全局变量,以便在函数执行完毕后可以被垃圾回收。
  • 显式清理:在不再需要使用的定时器、回调函数和DOM引用时,手动清理它们,例如通过使用clearTimeout()清除定时器。
  • 解除闭包:在不需要使用闭包时,手动解除对外部函数变量的引用,以便垃圾回收机制可以释放内存。
  • 使用垃圾回收器:JavaScript具有自动的垃圾回收机制,可以自动释放不再需要的内存。通过确保代码的正确性和效率,可以帮助垃圾回收器更好地工作。

常见的内存泄漏

全局变量

  1. 意外的全局变量

    function leakFunction() {leakVar = 'test'
    }
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    解决方法use strict 启用严格模式,严格模式会阻止创建意外的全局变量

  2. 全局变量未释放

    全局变量未释放也会导致内存泄漏,可通过将变量置为null释放全局变量,避免内存泄漏

    // 未释放的全局变量
    var globalVar = 'Hello'function doSomething() {
    // ...
    }// 忘记释放全局变量// 可通过以下方式释放
    // globalVar = null
    // doSomething = null
    

闭包

闭包 中被访问的参数和变量不会被JavaScript的垃圾回收机制回收,会导致内存泄漏,可通过将变量置为null释放全局变量,避免内存泄漏

function createClosure() {var value = 'Hello'// 创建一个闭包函数function closureFunction() {console.log(value)}// 返回闭包函数return closureFunction
}// 创建闭包
var closure = createClosure()// 闭包持有外部变量的引用,可能导致内存泄漏// 可通过以下方式释放
// closure = null

定时器未清理

未清理定时器也会导致内存泄漏,可通过clearInterval清理定时器,避免内存泄漏

// 创建一个定时器
var timer = setInterval(function() {// 定时器回调函数// ...
}, 1000)// 定时器未清理// 可通过以下方式清理定时器
// clearInterval(timer)

清除页面dom元素不完全

  1. 清除页面dom元素时,dom元素绑定的事件未解绑
var element = document.getElementById('button')
var counter = 0
function onClick(event) {counter++element.innerHtml = 'clickTime ' + counter
}element.addEventListener('click', onClick)// 可通过以下方式清理
// element.removeEventListener('click', onClick)
// element.parentNode.removeChild(element)

循环引用

当两个或多个对象之间存在相互引用,并且没有被其他对象引用,就会发生循环引用,从而导致内存泄漏。这种情况可以通过在对象之间断开引用来避免

function createObject() {var obj1 = {}var obj2 = {}obj1.ref = obj2obj2.ref = obj1return obj1
}
var myObj = createObject()
// 这里无法回收 myObj 和 myObj.ref 所占用的内存空间,导致内存泄漏

常见的防止内存泄露方法

  1. 显式释放引用

    在不再使用变量、对象或函数时,手动将其引用置为null,以便垃圾回收器可以正确地回收内存

    var obj = {}// 使用obj// 当不再需要obj时,将其引用置为null
    obj = null
    
  2. 清除定时器

    在使用setInterval或setTimeout函数创建定时器时,应确保在不需要时及时清除定时器。可以使用clearInterval或clearTimeout函数来清除定时器

    var timer = setInterval(function() {
    // 定时器回调函数
    // ...// 当不再需要定时器时,清除定时器
    clearInterval(timer)
    }, 1000)
    
  3. 移除事件监听器

    在使用addEventListener函数添加事件监听器时,确保在不需要时移除事件监听器,以避免对象无法被垃圾回收。可以使用removeEventListener函数来移除事件监听器

    var button = document.createElement('button')function handleClick() {
    // 点击事件回调函数
    // ...// 当不再需要事件监听器时,移除事件监听器
    button.removeEventListener('click', handleClick)
    }// 添加点击事件监听器
    button.addEventListener('click', handleClick)
    
  4. 避免创建不必要的闭包

    闭包可以使函数保持对其定义时的作用域的引用,从而可能导致内存泄漏。尽量避免在不需要时创建不必要的闭包

    function createClosure() {var value = 'Hello'// 创建一个闭包函数function closureFunction() {console.log(value)}// 返回闭包函数return closureFunction
    }// 创建闭包
    var closure = createClosure()// 当不再需要闭包时,释放闭包引用
    closure = null
    

相关文档

【温故而知新】JavaScript中内存泄露有那几种

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

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

相关文章

macos安装mysql一直卡在安装成功那个页面选项的解决办法

问题描述: 我安装的是比较新的版本8.0.37,安装过程中一直卡在安装那个选项上,且页面提示安装成功了,但就是死活不往下面的配置选项那一步走。 解决办法: 1.首先清理掉之前的mysql sudo rm -rf /usr/local/mysql2.然…

win11快速安装mysql数据库系统

win11快速安装mysql数据库系统 1、下载 1.1 打开官网 1.2 向下滚动页面 1.3 进入下载选项 1.4 下载8.0.4 LTS 1.5 开始下载 1.6 下载中 2、解压 大家注意,此时解压后目录是没有data目录的。 3、数据库初始化 3.1 管理员身份打开CMD 开始菜单上,输入…

代码随想录算法训练营第三十一天|455.分发饼干,376. 摆动序列,53. 最大子序和

455.分发饼干 优先把小饼干分给胃口值小的&#xff0c;或者是把大饼干分给胃口大的。 376. 摆动序列 class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 1) return nums.size();int curDiff 0; // 当前一对差值int preDiff …

详解绝对路径和相对路径的区别

绝对路径和相对路径是用于描述文件或目录在文件系统中位置的两种不同方式。 绝对路径&#xff08;Absolute Path&#xff09;是从文件系统的根目录开始的完整路径&#xff0c;可以唯一地确定一个文件或目录的位置。在不同的操作系统中&#xff0c;根目录的表示方式可能略有不同…

SpringSecurity安全过滤器工作原理

前面通过三篇文章&#xff0c;从底层代码的角度分析了SpringSecurity的初始化过程。 接下来我们就要具体看一下&#xff0c;Spring Security的安全过滤器初始化、装配好之后&#xff0c;到底是怎么工作的。 还是按图索骥 下面我们简单从底层源码分析一下&#xff0c;请求是怎…

基于SpringBoot设计模式之创建型设计模式·工厂方法模式

文章目录 介绍开始架构图样例一定义工厂定义具体工厂&#xff08;上衣、下装&#xff09;定义产品定义具体生产产品&#xff08;上衣、下装&#xff09; 测试样例 总结优点缺点与抽象工厂不同点 介绍 在 Factory Method模式中&#xff0c;父类决定实例的生成方式&#xff0c;但…

图像/视频恢复和增强CodeFormer

github&#xff1a;https://github.com/sczhou/CodeFormer 尝试增强旧照片/修复人工智能艺术 面部修复 面部色彩增强和恢复 脸部修复

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 目录 Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 一、简单介绍 二、监督学习 算法 说明前的 数据集 说明 三、监督学习 之 核支持向量机 1、线性模型与非线性特征 …

基于网络爬虫技术的网络新闻分析(二)

目录 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3 系统概要设计 3.1 设计约束 3.1.1 需求约束 3.1.2 设计策略 3.1.3 技术实现 3.3 模块结构 3.3.1 模块结构图 3.3.2 系统层次图 3.3.3…

JumpServer堡垒机应用(v3.10.8) 下

目录 JumpServer堡垒机简单式部署与管理(v3.10.8) 上-CSDN博客 一. 资产管理 1.1创建资产 1.2 给资产主机创建用户 1.2.1 普通账户&#xff1a; 1.2.2 特权账户&#xff1a; 1.2.3 创建用户 二. 命令过滤 2.1 创建命令组 2.2 创建命令过滤 ​编辑 三. 创建资产授权 …

在另外一个页面,让另外一个页面弹框显示操作(调佣公共的弹框)vue

大概意思是&#xff0c;登录弹框在另外一个页面中&#xff0c;而当前页面不存在&#xff0c;在当前页面中判断如果token不存在&#xff0c;就弹框出登录的弹框 最后一行 window.location.href … 如果当前用户已登录&#xff0c;则执行后续操作(注意此处&#xff0c;可不要)

2024中国应急(消防)品牌巡展西安站成功召开!惊喜不断

消防品牌巡展西安站 5月10日&#xff0c;由中国安全产业协会指导&#xff0c;中国安全产业协会应急创新分会、应急救援产业网联合主办&#xff0c;陕西消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-西安站成功举办。该巡展旨在展示中国应急&#xff08;消防&am…

ADS使用记录之使用RFPro进行版图联合仿真

ADS使用记录之使用RFPro进行版图联合仿真 在ADS中&#xff0c;我们往往使用EM仿真来明确电路的实际性能&#xff0c;但是常规的方法我们只会得到S参数&#xff0c;对于场还有电路的电流分布往往不进行检查。但是在实际中&#xff0c;观察场和电流分布是非常有意义的&#xff0…

Python送你小花花

快到520了&#xff0c;准备好送上你的爱意了吗&#xff1f; 还记得去年从网上模仿了一篇python使用turtle画的小花花程序&#xff0c;当时还没有转行到程序员行业&#xff0c;刚刚入门学习编程&#xff0c;还在纠结是学习python、Java还是C#的时候。 总会被一些猎奇的内容吸引&…

在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; 在Linux系统上使用nmcli命令配置各种网络&#xff08;有线、无线、vlan、vxlan等&#xff09;https://myweb.myskillstree.cn/123.html 更新于2024/5/13&…

01.认识HTML及常用标签

目录 URL&#xff08;统一资源定位系统&#xff09; HTML&#xff08;超文本标记语言&#xff09; 1&#xff09;html标签 2&#xff09;head标签 3&#xff09;title标签 4&#xff09;body标签 标签的分类 DTD文档声明 基础标签 1&#xff09;H系列标签 2&#xff09…

Linux 第三十四章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

【RSGIS数据资源】2001-2021 年亚洲季风区主要国家作物种植制度数据集

文章目录 1. 数据集概况2. 数据格式3. 文件名命名规则4. 数据生产服务单位5. 元数据6. 数据引用与参考文献引用 1. 数据集概况 2001-2021 年亚洲季风区主要国家作物种植制度数据集&#xff08;ACIA500&#xff09;是结合MODIS 影像和现有的土地利用等多源数据&#xff0c;基于…

CNN卷积神经网络初学

1.为什么要学CNN 在传统神经网络中&#xff0c;我们要识别下图红色框中的图像时&#xff0c;我们很可能识别不出来&#xff0c;因为这六张图的位置都不通&#xff0c;计算机无法分辨出他们其实是一种形状或物体。 这是传统的神经网络图&#xff0c;通过权重调整神经元和神经元…

五丰黎红销量增长的秘诀:一物一码数字化营销开创调味品行业新格局!

根据当今经济环境和未来的发展趋势&#xff0c;传统经济向数字化经济转型的发展方向可以说是大势所趋&#xff0c;如何把握先机&#xff0c;率先迈出数字化转型第一步&#xff0c;可以说是无数传统企业都需要思考的问题。 作为中国调味品行业的佼佼者&#xff0c;五丰黎红踩着时…