了解垃圾回收机制与内存泄漏

目录

一、垃圾回收机制的基本原理

(1)基本原理理解

(2)回收

二、垃圾回收的算法

1.标记清除算法

2.引用计数算法

三、减少垃圾回收

(1)减少对象创建

(2)优化数据结构及内存分配优化

(3)避免内存泄漏

四、避免内存泄漏的建议

(1)导致内存泄漏

(2)避免内存泄漏


前提:前端的垃圾回收机制主要指的是浏览器中的JavaScript引擎所实现的内存管理机制。这种机制自动回收不再使用的内存空间,以避免内存泄漏和内存溢出等问题。以下是JavaScript垃圾回收机制的详细介绍。

一、垃圾回收机制的基本原理

(1)基本原理理解

浏览器的JavaScript引擎具有自动垃圾回收机制,该机制会定期找出那些不再使用的变量和对象,并释放它们所占用的内存。垃圾回收的主要目标是识别和回收那些已经不可达的对象,即无法从根对象出发直接或间接访问到。

以下是一个简单的JavaScript代码示例,用于说明垃圾回收机制的工作原理:

let dog = new Object();
dog.a = new Array(1);// 这时dog和dog.a都是可达对象,不会被回收。dog.a = new Object();// 之前创建的数组对象成为了不可达对象,将被垃圾回收机制回收。

在这个例子中,当dog.a被重新赋值为一个新的对象时,之前与dog.a关联的数组对象就变成了不可达对象。在垃圾回收过程中,这个数组对象将被标记为垃圾并被回收。

(2)回收

  • 定期会处理不在使用的变量、对象,释放占用的内存。
  • 两种变量:全局变量和局部变量。全局变量会持续到页面卸载;局部变量在声明函数中,从函数执行开始,直到函数执行结束,就会被释放。
  • 特殊情况:当局部变量被外部函数使用时,例如闭包,在函数执行结束后,函数外部的变量仍然指向函数内部的局部变量,此时局部变量仍被使用,所以不会回收。

二、垃圾回收的算法

浏览器中的JavaScript引擎通常使用两种垃圾回收算法:标记清除(Mark-and-Sweep)和引用计数(Reference Counting)。现代浏览器主要使用标记清除算法,因为引用计数算法在处理循环引用时会出现问题。

1.标记清除算法

(1)标记阶段:从根对象,如全局对象、活动函数栈等开始,遍历内存中的对象,并给所有可达的对象打上标记。

(2)清除阶段:遍历整个堆内存,将未被标记的对象进行回收,并释放其占用的内存空间。

2.引用计数算法

每个对象都有一个引用计数器,用于记录当前对象被引用的次数。

当对象被引用时,其引用计数器加1;当对象引用被移除或销毁时,计数器减1。

当对象的引用计数器为0时,即没有任何引用指向它时,该对象被判定为不再被使用,可以回收。

注意:引用计数算法无法处理循环引用的问题。

举例:

// 假如对象A和B
let A = {};
let B = {};// A引用B
A.b = B;// B也引用A
B.a = A;A.b = null; // A不再引用B,但B仍然通过B.a引用A
B.a = null; // B不再引用A,但A已经没有机会知道B已经释放了对它的引用(在纯引用计数算法中)

由于它们相互引用,它们的引用计数器都不会变为0。看似已经断开了所有对AB的外部引用,由于它们之间的循环引用,它们的引用计数器仍然不为0,所以垃圾回收器如果仅依赖引用计数算法将不会回收它们,这就导致了内存泄漏。

三、减少垃圾回收

浏览器能进行垃圾自动回收,但是我们应该尽量减少垃圾回收。

(1)减少对象创建

对象尽量复用,不在使用的对象将其设置为null,尽快被回收。

(2)优化数据结构及内存分配优化

选择合适的数据结构来存储数据,以减少内存占用;

避免使用不必要的嵌套数据结构,简化数据结构层次;

在清空数组时,最简单的是给其赋值为[],但是会创建一个新的空对象。所以使用数组时,尽量通过修改数组长度设为0来清空数组。

(3)避免内存泄漏

及时解除不再需要的事件监听器和回调函数;

清理定时器或第三方库创建的对象,避免它们一直占用内存......

四、避免内存泄漏的建议

(1)导致内存泄漏

意外的全局变量

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

脱离DOM的引用

闭包

(2)避免内存泄漏

减少全局变量的使用:全局变量会一直存在于内存中,直到页面关闭。

避免循环引用:循环引用会导致内存泄漏,因为垃圾回收器无法回收这些对象。

及时清理事件监听器和定时器:未清理的事件监听器和定时器会一直存在于内存中。

注意闭包的使用:闭包会保留对外部函数的引用,可能导致外部函数的变量无法被垃圾回收。

优化DOM操作:避免频繁的DOM操作,减少DOM节点的创建和销毁。

  若文章对你有帮助,点赞、收藏加关注吧!

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

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

相关文章

Stable Diffusion Controlnet常用控制类型解析与实战课程 4

本节内容,是stable diffusion Controlnet常用控制类型解析与实战的第四节课程。上节课程,我们陆续讲解了几个与图像风格约束相关的控制类型,本节课程我们再学习一些实用价值较高的控制类型,看一看他们提供了哪些控制思路。 一&…

C++之二:类和对象

相关代码: C语言是面向过程的,关注的是过程,分析求解问题的步骤,调用函数逐步解决问题。 C是面向对象的,关注的是对象,将一件事情的完成分为不同的几个参与者(对象),靠…

B站bilibili视频转文字字幕下载方法

本文将讲述介绍一种使用本地工具如何快速的下载B站的字幕为本地文本文件的方法。 通常获取B站字幕需要在浏览器中安装第三方插件,通过插件获取字幕。随着大模型,生成式AI,ChatGPT的应用,B站也提供了AI小助手对视频的内容进行总结…

EM算法的参数更新过程

1. 计算每个高斯分布的责任度 责任度(Responsibility) 表示数据点 由第 k 个高斯分布生成的概率占总概率的比例。在 E步(Expectation Step) 中计算。 公式: 其中: ​: 责任度,表示数据点 ​ …

文件包含include

文件包含 第一道题是攻防世界的fileclude 这里第二行我们可以看见告诉我们在flag.php里面 然后检查了两次file1和file2是否为空 如果file2"hello ctf"成立 那么就可以包含file1 这里我们要使用php伪协议 来访问我们需要的flag.php并且将file2的数值改为"hello…

优选算法——链表

1. 链表常用技巧和操作总结 2. 两数相加 题目链接:2. 两数相加 - 力扣(LeetCode) 题目展示: 题目分析:本题给的是逆序,其实降低了难度,逆序刚好我们从第一位开始加,算法原理其实就…

【5G】5G的主要架构选项

最初,在3GPP讨论中考虑了所有可能的聚合和核心网络组合,共有八个架构选项。以下重点介绍option2、3、4和7。 1. 独立组网 (Standalone, SA) 架构选项 2 :Standalone architecture with 5G-core 特点: 5G核心网(5GC, …

css 动画实现从中间到两边亮度逐渐变暗的流水灯效果

先看效果&#xff1a; 快结束效果 随着离中心点距离逐渐边远&#xff0c;亮度逐渐变暗 完整的视线代码如下&#xff1a; <template><div class"container"><div class"runner bottom to-right"></div><div class"runner …

kubeadm_k8s_v1.31高可用部署教程

kubeadm_k8s_v1.31高可用部署教程 实验环境部署拓扑图**部署署架构****Load Balance****Control plane node****Worker node****资源分配&#xff08;8台虚拟机&#xff09;**集群列表 前置准备关闭swap开启ipv4转发更多设置 1、Verify the MAC address and product_uuid are u…

测评|携程集团25年社招在线测评北森题库、真题分析、考试攻略

携程集团社招入职测评北森题库主要考察以下几个方面&#xff1a; 1. **言语理解**&#xff1a;这部分主要测试应聘者运用语言文字进行思考和交流、迅速准确地理解和把握文段要旨的能力。 2. **资料分析**&#xff1a;包括文字题和图表题&#xff0c;考察应聘者快速找出关键信息…

workman服务端开发模式-应用开发-websockt应用介绍

一、workerman介绍 1、框架介绍 workerman-chat框架是基于workerman的GatewayWorker框架开发的一款高性能支持分布式部署的聊天室系统。 workerman框架官网&#xff1a;http://www.workerman.net/ GatewayWorker框架文档&#xff1a;http://www.workerman.net/gatewaydoc/ 2、特…

34. 在排序数组中查找元素的第一个和最后一个位置 二分法

34. 在排序数组中查找元素的第一个和最后一个位置 class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> res(2,-1);res[0]findleft(nums,target);if(res[0] -1) return res;res[1] findright(nums,target);…

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍03-SQL注入联合查询注入(Union-Based SQL Injection)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

你了解TCP/IP参考模型吗

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 你了解TCP/IP参考模型吗 一. TCP/IP参考模型二. TCP/IP模型图解三. TCP/IP模型的对比与OSI模型四. TCP/IP协议族五. 总结 TCP/IP参考…

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

RK3588 ,基于FFmpeg, 拉取RTSP,使用 mpp 实现硬解码. ⚡️ 参考: Rk3588 FFmpeg 拉流 RTSP, 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode RTSPint open_stream(

MySQL八股-全局锁,表级锁,表锁,元数据锁,意向锁,行级锁,行锁,间隙锁,临键

文章目录 全局锁表级锁表锁(表级锁)元数据锁(MDL&#xff0c;Meta Data Lock&#xff0c;表级锁)元数据锁演示元数据锁兼容的情况元数据锁互相阻塞的情况 意向锁&#xff08;Intention lock&#xff0c;表级锁&#xff09;意向锁分类意向锁演示&#xff1a;意向共享锁(**IS**)与…

【BUG记录】Apifox 参数传入 + 号变成空格的 BUG

文章目录 1. 问题描述2. 原因2.1 编码2.2 解码 3. 解决方法 1. 问题描述 之前写了一个接口&#xff0c;用 Apifox 请求&#xff0c;参数传入一个 86 的电话&#xff0c;结果到服务器 就变成空格了。 Java 接收请求的接口&#xff1a; 2. 原因 2.1 编码 进行 URL 请求的…

51c视觉~合集31

我自己的原文哦~ https://blog.51cto.com/whaosoft/12088488 #PDD 西南交大&利兹大学等联合提出金字塔离散扩散模型&#xff08;PDD&#xff09;&#xff0c;实现了3D户外场景生成的粗到细的策略 本文是对 ECCV 2024 Oral 文章Pyramid Diffusion for Fine 3D Large S…

strace跟踪的原理以及使用

如果想成为一名合格的工程师&#xff0c;那肯定应该知道如何去分析应用逻辑&#xff0c;对于如何优化应用代码提升系统性能也应该能有自己的一套经验。而今天想要讨论的是&#xff0c;如何拓展自己的边界&#xff0c;让自己能够分析代码之外的模块&#xff0c;以及对我自己而言…

Canoe CAPL编程

文章目录 CAPL 简介CAPL的程序结构CAPL的数据类型1. 无符号整数2. 有符号整数3. 有符号整数4. CAN消息类型5. 定时器类型6. 变量定义 on message xxx 中 this相关方法公共方法1. output(msgName) 从程序块输出message&#xff08;形式1&#xff09;或errorframe&#xff08;形式…