JavaScript 导致内存泄漏的场景和规避方法

        在日常开发中,我们经常会无意识一些操作导致内存溢出。为此我总结一下内存溢出的几种场景供大家参考。希望能在优化自己代码的道路上有所帮助。

1、意外的全局变量

由于使用未声明的变量,而意外的创建了一个全局变量,使这个变量一直留在内存中无法被回收。

【在函数内未使用varlet, 或 const声明的变量会被自动创建为全局变量】

function add() { quanju= "这个是全局变量"; }

规避方法:首先写代码时注意尽量避免使用全局变量,如果实在避免不了,在使用完后将其删除(delete quanju)或赋值为 null

2、被遗忘的计时器或回调函数

如果设置了定时器(setInterval 或 setTimeout)或者异步回调函数(如XMLHttpRequest的回调),但是没有正确清除(clearInterval 或 clearTimeout),那么这些回调会保留着对它们所在的执行环境的引用,导致泄漏。

规避方法:及时清理不需要的定时器和异步回调。

3、脱离 DOM 的引用

给DOM对象添加的属性是一个对象的引用

var a = {};
document.getElementById('id').diyProp = a;

 规避方法:在window.onload时间中加上 document.getElementById(‘id’).diyProp = null

获取一个 DOM 元素的引用, 而后面这个元素被删除, 由于一直保留了对这个元素的引用, 所以它也无法被回收。

var tag = document.getElementById('id');
document.body.removeChild(tag);

 规避方法:tag=null【将tag变量赋值成null】

4、闭包造成内存泄漏

不合理的使用闭包, 从而导致某些变量一直被留在内存当中。

// 错误的示例:使用闭包保留外部作用域的引用
function createClosure() {const data = '敏感数据';return function() {console.log(data);};
}
const closure = createClosure();// closure保留了对data的引用,即使不再需要data

运行后结果: 外部信息、 内部信息

规避方法:在不再需要闭包时,确保解除对外部作用域的引用。

function createClosure() {const data = '敏感数据';return function() {console.log(data);};
}
let closure = createClosure();// 在不再需要闭包时,解除引用
closure = null;

5、console.log 没有注释掉造成泄漏 

规避方法:在代码编写完成测试无误后,清除console.log

6、循环引用

循环引用是另一个可能导致内存泄漏的情况。当两个或多个对象相互引用时,即使你不再使用它们,它们也无法被垃圾回收。

// 错误的示例:循环引用
function createObjects() {const obj1 = {};const obj2 = {};obj1.ref = obj2;obj2.ref = obj1;return 'Objects created';
}
createObjects();

 规避方法:尽量避免循环引用,如果有需要确保在不再需要对象时,将其引用设置为null,打破循环引用。

function createObjects() {const obj1 = {};const obj2 = {};obj1.ref = obj2;obj2.ref = obj1;// 手动打破循环引用obj1.ref = null;obj2.ref = null;return 'Objects created';
}

此文章借鉴了下面博主的优秀文章

文章链接

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

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

相关文章

Danikor智能拧紧轴控制器过压维修知识

【丹尼克尔拧紧轴控制器故障代码维修】 【丹尼克尔Danikor控制器维修具体细节】 丹尼克尔拧紧轴控制器作为一种高精度的电动拧紧工具,广泛应用于各种工业生产线。然而,在使用过程中,由于各种原因,可能会出现Danikor扭矩扳手控制…

Linux系统编程——部分内容补充

回顾 进程 内核相关数据结构 代码和数据,一个可执行程序加载到内存变成进程,不仅仅是把代码和数据加载进去就完事了,得“先描述,再组织”,每个进程都有内核数据结构,地址空间,进程相关页表&a…

内核学习——5、中断

硬中断: 是一个异步信号,或需要改变执行一个同步事件 外设产生,基于IRQ,CPU将相应请求给到硬件驱动处理事务 处理中断的驱动需要运行在CPU上的,中断产生时,CPU停止当前程序去处理中断请求,一个…

【案例分析】一文讲清楚SaaS产品运营的六大杠杆是什么?具体怎么运用?

在SaaS(软件即服务)行业,如何快速获取用户并实现持续增长一直是企业关注的重点。近年来,分销裂变策略因其高效性和低成本特性,成为许多SaaS企业实现快速增长的秘诀。下面,我们将通过一个具体的案例来剖析成…

Ubuntu-24.04-live-server-amd64安装界面中文版

系列文章目录 Ubuntu安装qemu-guest-agent Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、准备工作二、开始安装三、测试效果总结 前言 Centos结束,转战Ubuntu。我之所以写这篇文章,是因为我…

精细化,智能费控4.0的竞争内核

出差,在百度百科被释义为,受派遣到外地或负担临时任务。 这是一个对员工清晰对管理却笼统的定义。站在企业费用管理的角度,出差可细分为会议出差、培训出差、市场拓展出差、项目出差、驻外回厂出差、探亲出差、售后维修出差、新人报道出差等不…

防爆气象站:化工厂区气象环境监测的最佳选择

在化工厂区,气象环境监测至关重要,它直接关系到生产安全、环境保护以及员工健康。防爆气象站作为专业的监测设备,凭借其独特的防爆性能和精准的数据监测能力,成为化工厂区气象环境监测的最佳选择。 防爆气象站采用先进的防爆技术…

访问网络 测试没有问题,正式有问题

ping -c 5 -i 1 www.baidu.com 首先检查一下网络,在正式服务器ping 一下要访问的地址。 如果不行,联系网络管理员开通。 笔者因为这个问题浪费了半天时间,一开始都以为是代码问题 以后大家看到这个异常,解决如下: …

逻辑卷管理器 (LVM) 简介

古老的 e5 主机目前有这些存储设备 (硬盘): 系统盘 (M.2 NVMe SSD 480GB), 数据盘 (3.5 英寸 SATA 硬盘 4TB x2). 窝决定使用 LVM 对数据盘进行管理. 逻辑卷管理器 (LVM) 可以认为是一种 (单机) 存储虚拟化 技术. 多个物理存储设备 (PV) 组成一个存储池 (VG), 然后划分虚拟分区…

docker ce的使用介绍

docker docker17.03以后 docker ce,社区免费版,vscode的docker插件使用的该版本(默认windows只支持windows容器,linux支持linux容器)docker ee,企业版本 docker17.03以前 docker toolbox,基于…

手把手带你从异构数据库迁移到崖山数据库

一、数据迁移简介 1.典型场景与需求 在国产化浪潮下,数据库系统的国产化替代成为了一个日益重要的议题,有助于企业降低对外依赖,提升信息安全和自主性。 以Oracle、MySQL为代表的传统关系型数据库管理系统,在企业应用中占据了重要…

angular12父子组件通信的三种方法

在Angular中,父组件可以通过输入属性(Input)来传递数据给子组件,但是不能直接修改子组件内部的变量,尤其是如果这些变量不是通过输入属性传递的。这是因为在Angular中,子组件的内部状态应该由子组件自己管理…

7zip安装后压缩包图标显示空白解决办法

记录安装7zip软件后,出现了如下的图标是空白的问题: (虽然我最终解决了但是我不确定是哪一步起的作用,但是我也懒得再情景复现了。) 我的解决过程是: 在开始菜单栏搜索“7zip ”然后点击“打开。 然后点击 &#xf…

Android Service学习笔记

1、Service介绍 Android Service(服务)是 Android 四大组件之一,主要作用是执行后台操作。它是一个后台运行的组件,执行长时间运行且不需要用户交互的任务。即使应用被销毁也依然可以工作。 Service并不是运行在一个独立的进程当…

【送模板】5张图,帮你轻松搞懂OKR工作法

OKR是目标与关键结果法的缩写,OKR运用在工作中就是强调对业务进行逻辑思考,找到目标与关键结果之间的因果关系。这种因果关系的是否准确决定我们努力的价值。 OKR是一种高效的目标管理方法。“O”就是object,目标的意思,“kr”就…

81600B keysight 是德 可调谐激光源 简述

KEYSIGHT 81600B 是可调谐激光源模块,广泛应用于光通信和光学测试领域。该系列产品通过低自发源发射(low SSE)技术实现了高信噪比(>70 dB/nm),并具有快速准确的扫描能力,覆盖1260 nm至1640 n…

2024 年 Python 基于 Kimi 智能助手 Moonshot Ai 模型搭建微信机器人(更新中)

注册 Kimi 开放平台 Kimi:https://www.moonshot.cn/ Kimi智能助手是北京月之暗面科技有限公司(Moonshot AI)于2023年10月9日推出的一款人工智能助手,主要为用户提供高效、便捷的信息服务。它具备多项强大功能,包括多…

大模型 舆情分析 数据构造 prompt提示词 经验分享 数据准备

最近在做舆情分析,需要执行比较复杂的任务流程(例如同时执行人名识别、相关机构识别、90分类),传统Bert无法胜任,因此尝试使用大模型进行处理。 下面的一些提示词是我用来准备数据的,这些数据可以按照不同…

flutter 导出iOS问题3

更新flutter版本后 macminihaomacMiniaodeMini SocialIM % flutter --version Flutter 3.7.12 • channel stable • https://github.com/flutter/flutter.git Framework • revision 4d9e56e694 (1 year, 2 months ago) • 2023-04-17 21:47:46 -0400 Engine • revision 1a6…

MDPO:Conditional Preference Optimization for Multimodal Large Language Models

MDPO: Conditional Preference Optimization for Multimodal Large Language Models 相关链接:arxiv 关键字:多模态、大型语言模型、偏好优化、条件偏好优化、幻觉减少 摘要 直接偏好优化(DPO)已被证明是大型语言模型&#xff08…