JavaScript内存泄露原因及解决方案

news/2025/10/11 14:58:40/文章来源:https://www.cnblogs.com/amulong1237/p/19135053

在 JavaScript 中,内存泄漏通常发生在不需要的内存没有被垃圾回收器释放时。以下是常见的几种情况:

1. 意外的全局变量

// 意外的全局变量
function foo() {bar = "这是一个全局变量"; // 没有使用 var/let/const
}function baz() {this.accidentalGlobal = "这也是全局变量"; // 在非严格模式下,this 指向全局对象
}
baz();

解决方案:

// 使用严格模式
"use strict";function foo() {let bar = "局部变量"; // 使用 let/const
}

2. 被遗忘的定时器和回调函数

// 未清理的定时器
let data = getData();
setInterval(() => {let node = document.getElementById('Node');if(node) {node.innerHTML = JSON.stringify(data);}
}, 1000);// 未移除的事件监听器
const button = document.getElementById('button');
button.addEventListener('click', onClick);// 页面卸载时没有移除监听器

解决方案:

// 清理定时器
const intervalId = setInterval(callback, 1000);
// 需要时清理
clearInterval(intervalId);// 移除事件监听器
const button = document.getElementById('button');
button.addEventListener('click', onClick);
// 需要时移除
button.removeEventListener('click', onClick);

3. DOM 引用

// 保留对 DOM 元素的引用
let elements = {button: document.getElementById('button'),image: document.getElementById('image')
};// 即使从 DOM 中移除了元素,仍然在内存中保留引用
function removeButton() {document.body.removeChild(document.getElementById('button'));// elements.button 仍然引用着已移除的 DOM 元素
}

解决方案:

// 及时清理引用
function cleanUp() {elements.button = null;elements.image = null;
}

4. 闭包

// 闭包导致的内存泄漏
function createClosure() {let largeArray = new Array(1000000).fill('*');return function() {console.log(largeArray.length);// largeArray 一直被闭包引用,无法被回收};
}const closure = createClosure();

解决方案:

// 及时释放闭包引用
function useClosure() {const closure = createClosure();// 使用完毕后释放closure = null;
}

5. 缓存对象

// 无限增长的缓存
const cache = {};
function setCache(key, value) {cache[key] = value;
}// 没有清理机制,缓存会无限增长

解决方案:

// 使用有大小限制的缓存
class LimitedCache {constructor(maxSize = 100) {this.maxSize = maxSize;this.cache = new Map();}set(key, value) {if (this.cache.size >= this.maxSize) {const firstKey = this.cache.keys().next().value;this.cache.delete(firstKey);}this.cache.set(key, value);}
}

6. 分离的 DOM 节点

// 从 DOM 树中移除但仍在 JavaScript 中引用的节点
let detachedTree;
function create() {const ul = document.createElement('ul');for(let i = 0; i < 10; i++) {const li = document.createElement('li');ul.appendChild(li);}detachedTree = ul; // 保留引用但未添加到 DOM
}create();
// detachedTree 引用的整个 UL 树都无法被回收

7. 事件监听器在组件销毁时未移除

// 在单页应用中常见的问题
class Component {constructor() {this.handleResize = this.handleResize.bind(this);window.addEventListener('resize', this.handleResize);}handleResize() {// 处理逻辑}// 缺少销毁方法,事件监听器会一直存在
}// 正确的做法
class SafeComponent {constructor() {this.handleResize = this.handleResize.bind(this);window.addEventListener('resize', this.handleResize);}destroy() {window.removeEventListener('resize', this.handleResize);}
}

预防内存泄漏的最佳实践

  1. 使用严格模式防止意外的全局变量
  2. 及时清理定时器和事件监听器
  3. 避免不必要的全局变量
  4. 在组件销毁时清理所有引用
  5. 使用弱引用(WeakMap、WeakSet)当需要时
  6. 定期进行内存分析使用开发者工具
// 使用 WeakMap 避免内存泄漏
const weakMap = new WeakMap();
let domNode = document.getElementById('node');
weakMap.set(domNode, 'some data');// 当 domNode 被移除时,WeakMap 中的条目会自动被垃圾回收

通过遵循这些实践,可以显著减少 JavaScript 应用中的内存泄漏问题。

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

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

相关文章

数据类型扩展

整数扩展 整数按进制可以分为二进制0b(binary)开头,八进制0开头,十进制和十六进制0x开头; 因此,二进制的10输出为2,因为逢2进1,同样地,0x10代表16,因为在十六进制中,逢十六进1;同时,在十六进制中,10-15表…

python静态类型之any

python静态类型之any 漫思

2025 年最新金蝶云服务商推荐榜单:聚焦铂金伙伴技术实力与万级客户口碑,助力企业数字化转型精准选型上海金蝶云服务商推荐

当前数字经济浪潮下,企业数字化转型进程不断加快,ERP 系统作为转型核心支撑,其服务商的选择直接决定转型成效。但金蝶云服务商市场资质杂乱、服务能力悬殊,众多企业在选型时屡屡碰壁,不仅难以辨别服务商真实水平,…

OIFHA251011 比赛总结

比赛:OIFHA251011 日期:\(25.10.11\),场地:\(\text{OIFHA}\),排名:\(6/16\) 估分:\(100+100+0+20=220\) 终分:\(100+100+10+20=220\) 应该得分:\(100+100+10+40=250\) 失分 没想到 \(T_4\) 可以直接离线下来慢…

P2051 [AHOI2009] 中国象棋 个人题解

题目链接 题目描述: 给你一个 \(n*m\) 的棋盘,棋盘的每行和每列只能放置有 \(2\) 个棋子(可以放置 \(0\) 个棋子),问有多少种放置方案 解题方法: 这道题看起来像是八皇后问题的加强版,但是如果一个个枚举的话,…

一种智能调度分布式路径计算解决方案

本文分享自天翼云开发者社区《一种智能调度分布式路径计算解决方案》.作者:蒋辉 背景技术 传统的CDN动态加载智能路由系统对用户动态请求,主要通过探测服务器主动发起周期性的探测请求,探测CDN中转节点和源站的可用…

使用 C++ 和 minizip 实现 ZIP 压缩解压工具

在软件开发中,文件压缩和解压是常见的需求。今天我们来介绍一个基于 minizip 库的 C++ ZIP 工具类 - ZipUtility,它可以轻松地处理 ZIP 文件的创建和解压。这篇文章使用AI辅助编写。核心功能 1. 压缩功能 ZipUtility…

西部数码使用外部dns服务器怎么配置解析

西部数码使用外部dns服务器怎么配置解析在西部数码购买的域名如果使用的dns是外部的,要在该外部dns管理平台去设置解析 比如使用的阿里云的dns如何设置解析 在阿里云dns管理页面找到dns粘贴到西部数码该域名的解析地址…

一看就懂,Oracle认证体系中的OCP中级认证

对于刚接触Oracle数据库或者打算往数据库领域发展的人来说,需要了解一下这个认证:Oracle的中级认证OCP认证专家。 OCP认证全称为Oracle Certified Professional(甲骨文认证专家),是全球知名的IT技术认证体系之一,由…

实用指南:SDN 控制器深度剖析:架构、对比与实践部署

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年试验机生产厂家最新推荐榜单:聚焦优质企业,助力精准选购高低温等各类试验设备弹簧拉压/弹簧疲劳/高频弹簧疲劳/U型弹簧专用试验机厂家推荐

在工业生产与科研检测的关键环节,试验机对保障产品质量、验证材料性能起着不可替代的作用。随着市场需求激增,试验机生产厂家数量骤增,但行业乱象也随之显现,产品质量参差不齐、技术水平差距悬殊、服务体系不完善等…

IIS/如何查看IIS上部署网站的实时连接数

我们在IIS发布的Web网站,如何查看网站实时的连接数呢? 1、首先打开运行框,输入perfmon.msc 2、打开监视工具-->性能监视器 3、点击 “+”号,添加计数项 Web Service/Current Connections 4、可以查看到网站的实…

Supabase:无需后端代码的 Web 开发完整解决方案

在现代 Web 应用开发中,构建 MVP(最简可行产品)时,后端基础设施的搭建常常成为主要瓶颈。开发者需要处理数据库、API、用户认证、权限控制、文件存储等多个模块,开发成本较高。 Supabase 提供了一种替代方案:它以…

Halo RAG!

Halo AI 助手插件最新版本深度集成了 RAG 问答功能,支持将 Halo 文章或 Docsme 文档作为知识库,为访客提供智能问答服务。用户需先创建知识库,配置嵌入模型并选择内容范围以建立索引;随后创建问答应用,关联知识库…

拼叨叨砍价系统:实体店低成本引流的营销利器

在互联网营销深入各行业的当下,“砍一刀” 凭借强社交裂变属性,已成为大众熟知的营销模式。拼叨叨砍价系统基于这一模式,针对实体店商家营销痛点,打造出轻量化、易操作的砍价活动模块,支持微信公众号部署,能帮助…

2025 自动门生产厂家最新推荐榜:权威筛选优质品牌,含选购指南与实力厂家深度解析

在出入口自动化浪潮下,自动门已成为商业综合体、医院、工业厂区等场景的刚需设备,但其市场呈现 “繁荣与乱象并存” 的态势。部分品牌缺乏核心技术,产品故障率高、寿命短,无形中增加使用成本;售后体系缺失导致故障…

grafana-使用grafana-image-renderer:v4.0.17渲染仪表盘图像

grafana-使用grafana-image-renderer:v4.0.17渲染仪表盘图像v4.0.17需要grafana版本在11.3.8以上。我的是centos7, 升级grafana很简单,备份一下数据和配置,然后停掉grafana服务,然后使用【rpm -Uvh 新版本的rpm包 …

医德出诊排班挂号管理系统:医院高效运营与便民服务的智能解决方案

在数字化医疗浪潮下,传统挂号模式的低效、信息不透明等问题日益凸显,患者就医体验不佳,医院管理压力也持续增加。医德出诊排班挂号系统作为一款聚焦医疗服务场景的数字化工具,依托微信公众号生态,整合出诊排班、预…

一佳教育培训课程系统小程序:一站式教育数字化解决方案

在数字化教育浪潮下,培训机构对高效、多功能的线上教学管理工具需求迫切。一佳教育培训课程系统小程序应运而生,涵盖微信小程序版本,支持微擎系统交付,集课程管理、学员运营、营销推广、商城功能于一体,以加密源码…

SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施

本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。作者:顾汉杰(执少)"纸上得来终觉浅,绝知此事要躬行。" —— 陆游在 LLM 应用快…