内存泄漏的原因及排查方法

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

✨ 前言

        随着网页应用的逐渐复杂化,内存管理也变得越来越重要。内存泄漏不仅会导致网页变卡,加载速度减慢,还可能导致浏览器完全崩溃。因此,及时发现和定位内存泄漏,对保证网页性能至关重要。

        本文将详细介绍内存泄漏的原因、排查方法以及预防技巧。首先,我们来了解什么是内存泄漏,以及在 JavaScript 开发中常见的几种内存泄漏情况。然后,本文将提供浏览器工具的使用技巧,帮助大家定位内存泄漏。最后,我们将学习内存管理的最佳实践,在编码时尽量避免内存泄漏的发生。

        希望通过本文的阅读,可以帮助大家掌握内存泄漏的排查方法,写出高性能的 JavaScript 代码。现在,就让我们正式开始今天的内存之旅!

✨ 正文

一、什么是内存泄漏

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

二、垃圾回收机制 

垃圾回收机制怎么知道,哪些内存不再需要呢?

        最常使用的方法叫做"引用计数"(reference counting):语言引擎有一张"引用表",保存了内存里面所有的资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此可以将这块内存释放。

上图中,左下角的两个值,没有任何引用,所以可以释放。

如果一个值不再需要了,引用数却不为0,垃圾回收机制无法释放这块内存,从而导致内存泄漏。

const arr = [1, 2, 3, 4];
console.log('hello world');

        上面代码中,数组[1, 2, 3, 4]是一个值,会占用内存。变量arr是仅有的对这个值的引用,因此引用次数为1。尽管后面的代码没有用到arr,它还是会持续占用内存。

        如果增加一行代码,解除arr[1, 2, 3, 4]引用,这块内存就可以被垃圾回收机制释放了。

let arr = [1, 2, 3, 4];
console.log('hello world');
arr = null;

        上面代码中,arr重置为null,就解除了对[1, 2, 3, 4]的引用,引用次数变成了0,内存就可以释放出来了。

        因此,并不是说有了垃圾回收机制,程序员就轻松了。你还是需要关注内存占用:那些很占空间的值,一旦不再用到,你必须检查是否还存在对它们的引用。如果是的话,就必须手动解除引用。 

三、JavaScript 中的内存泄漏

在 JavaScript 中,内存泄漏多由全局变量、闭包、定时器等造成。

1. 全局变量

全局变量会持续存在,除非页面关闭。如果频繁地创建全局变量,会积累很多无用的内存。

2. 闭包

闭包会使得函数中的变量都被保存在内存中,而不是在函数调用结束后,自动释放。

3. 定时器

setInterval 和 setTimeout 如果不能正确清除,也会导致内存泄漏。

三、如何发现内存泄漏

1. 浏览器工具

Chrome 和 Firefox 都提供了查找内存泄漏的工具。

Chrome 的 Memory 面板可以看到内存使用情况,Timeline 面板可以录制内存变化情况。

Firefox 的 about:memory 对内存使用也有详细的分析。

2. 堆内存快照

通过比较两次的堆内存快照,可以判断内存有没有泄漏。

四、如何避免内存泄漏

  • 及时释放无用的全局变量
  • 闭包用完及时销毁
  • 使用完定时器要关闭
  • 避免频繁进行垃圾回收

小心使用内存,谨防内存泄漏,可以有效优化网页性能。

✨ 结语

        总结来说,内存泄漏是一种常见的程序优化问题,它会降低程序性能,造成不必要的内存浪费。合理使用全局变量、避免不必要的闭包、清除无用的定时器,以及适当的内存管理,都可以有效地预防内存泄漏的发生。

        在编程中,我们要提高警惕,时刻检查自己的代码,避免出现内存泄漏的情况。同时,也要掌握相应的调试技巧,善于使用浏览器和其他工具来发现内存泄漏,并及时修复。只有这样,才能写出高质量和高性能的代码,保证用户的良好体验。

        

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

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

相关文章

YUDIAN(宇电)温控器参数笔记(二)

没想到啊,时隔3年,我又用到了这个温控器,又来更新一下,因为我刚好要做一个简易的控温系统,类似于恒温水槽。 这个系统大概就是: 温控器用pt100测温,作为输入,输入连接到一个ssr上&a…

Start gtkmm 4 Programming (range controls)_

文章目录 基础解析 Chapter 7. Range Widgets https://gtkmm.org/en/documentation.htmlhttps://gnome.pages.gitlab.gnome.org/gtkmm-documentation/index.html 基础 容器: 容器小部件与其他小部件一样,派生自Gtk::Widget.例如Gtk::Grid可以容纳许多子小部件&…

vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)

概述:没有后端数据的前端,就失去了灵魂,由于本人没有写后端数据,所有调用黑马的,往下看相信对你会有收获的。 目录 第一步:安装axios 第二步:编写后端访问地址 第三步:编写具体的…

如何更新github上fork的项目(需要一定git基础)

如何更新Fork的项目(需要一定git基础) 前言:本文记录一下自己在github上fork了大佬的开源博客项目https://github.com/tangly1024/NotionNext,如何使用git克隆以及自定义开发和同步合并原项目更新迭代内容的的步骤 如何更新fork的项目(进阶版) 首先你…

解决:ModuleNotFoundError: No module named ‘selenium’

解决:ModuleNotFoundError: No module named ‘selenium’ 文章目录 解决:ModuleNotFoundError: No module named selenium背景报错问题报错翻译报错位置代码报错原因解决方法方法一,直接安装方法二,手动下载安装方法三&#xff0…

数字图像处理(实践篇)三十七 OpenCV-Python 使用SIFT和BFmatcher对两个输入图像的关键点进行匹配实践

目录 一 涉及的函数 二 实践 三 报错处理 使用SIFT(尺度不变特征变换)算法

幻兽帕鲁服务器Palworld游戏怎么更新?

自建幻兽帕鲁服务器进入Palworld游戏提示“您正尝试加入的比赛正在运行不兼容的游戏版本,请尝试升级游戏版本”什么原因?这是由于你的客户端和幻兽帕鲁服务器版本不匹配,如何解决?更新幻兽帕鲁服务器即可解决。阿里云百科aliyunba…

git操作之本地代码修改后想回退成当前最新版本

这张图很关键,取自https://www.cnblogs.com/cblx/p/12467083.html 我们的vscode就是workspace,我们提交代码需要三步,add,commit,push,其中我们想拉取代码有两种方式,git pull或者git fetch/cl…

《【Python】如何设置现代 Python 日志记录 | Python 基础教程 | Python 冷知识 | 十分钟高手系列》学习笔记

《【Python】如何设置现代 Python 日志记录 | Python 基础》 2 PUT ALL HANDLERS/FILTERS ON THE ROOT:扁平化的设计有助于简化维护成本 5 STORE CONFIG IN JSON OR YAML FILE:使用配置文件可以将配置和代码解耦,减少代码量 日志设置示例 7 …

ubuntu 22安装配置并好安全加固后,普通用户一直登录不上

现象 ubuntu 22安装配置并好安全加固后,普通用户一直登录不上 排查报错 查看日志/var/log/auth.log发现报错 Jan 30 15:49:57 aiv-O-E-M sshd[62570]: PAM unable to dlopen(pam_tally2.so): /lib/security/pam_tally2.so: cannot open shared object file: No …

管理的四种风格

前言 管理的四种风格,一般的领导大概就是这几种管理模式,告知,辅导,参与,授权,还有就是乱搞式(神经病模式)。 一、告知式 告知式是指组织通过正式、明确的渠道,将信息传达给员工。这种方式通常用于传递基本的规章制度、工作流程、政策文件等。告知式的作用在于确保员…

体验 AutoGen Studio - 微软推出的友好多智能体协作框架

体验 AutoGen Studio - 微软推出的友好多智能体协作框架 - 知乎 最近分别体验了CrewAI、MetaGPT v0.6、Autogen Studio,了解了AI Agent 相关的知识。 它们的区别 可能有人要问:AutoGen我知道,那Autogen Studio是什么? https://g…

pandas绘制饼图:百分比、定制标签、关闭图例、支持中文

matplotlib绘制饼图 import matplotlib.pyplot as pltplt.rc(font, family=SimHei, size=13) size = [25, 15

C++_list

目录 一、模拟实现list 1、list的基本结构 2、迭代器封装 2.1 正向迭代器 2.2 反向迭代器 3、指定位置插入 4、指定位置删除 5、结语 前言: list是STL(标准模板库)中的八大容器之一,而STL属于C标准库的一部分,因此在C中可以直接使用…

npm 淘宝镜像正式到期

由于node安装插件是从国外服务器下载,如果没有“特殊手法”,就可能会遇到下载速度慢、或其它异常问题。 所以如果npm的服务器在中国就好了,于是我们乐于分享的淘宝团队干了这事。你可以用此只读的淘宝服务代替官方版本,且同步频率…

AsyncLocal是如何实现在Thread直接传值的?

一:背景 1. 讲故事 这个问题的由来是在.NET高级调试训练营第十期分享ThreadStatic底层玩法的时候,有朋友提出了AsyncLocal是如何实现的,虽然做了口头上的表述,但总还是会不具体,所以觉得有必要用文字图表的方式来系统…

百度智能小程序开发平台:SEO关键词推广优化 带完整的搭建教程

移动互联网的普及,小程序成为了众多企业和开发者关注的焦点。百度智能小程序开发平台为开发者提供了一站式的解决方案,帮助企业快速搭建并推广自己的小程序。本文将重点介绍百度智能小程序开发平台的SEO关键词推广优化功能,并带完整的搭建教程…

img标签插入图片下方有空隙,怎么解决?

在写静态页面时,经常会用 img 标签插入图片,但图片插入后,直接在浏览器中运行时,图片的下方经常会有空隙间距,文字或者其它元素不好跟图片对齐,devtools 工具查看的话会很明显。 如下图: 上图…

Coppeliasim倒立摆demo

首先需要将使用Python远程控制的文件导入到文件夹,核心是深蓝色的三个文件。 本版本为4.70,其文件所在位置如下图所示,需要注意的是,目前不支持Ubuntu22的远程api: 双击Sphere这一行的灰色文件,可以看到远程…

【Docker】【深度学习算法】在Docker中使用gunicorn启动多个并行算法服务,优化算法服务:从单进程到并行化

文章目录 优化算法服务:从单进程到并行化单个服务架构多并行服务架构Docker化并指定并行服务数量 优化算法服务:从单进程到并行化 在实际应用中,单个算法服务的并发能力可能无法满足需求。为了提高性能和并发处理能力,我们可以使…