【JS】—垃圾回收机制

news2025/2/26 14:13:18

一、指令材料

1.定义

JavaScript(JS)的垃圾回收机制是一种自动管理内存的过程,它有助于释放不再使用的内存,以避免内存泄漏和提高程序的性能。
JavaScript的垃圾回收机制是一种自动管理内存的方式,以确保不再被引用的对象可以被垃圾回收,释放内存。

2.分类

2-1. 引用计数算法

引用计数算法通过跟踪每个对象被引用的次数来决定何时回收内存。当一个对象的引用计数为零时,它就会被垃圾回收.

2-2. 循环引用

循环引用是一种特殊情况,其中两个或多个对象互相引用,导致它们的引用计数不会降为零。这时,垃圾回收需要使用更复杂的算法来检测并处理循环引用。

2-3. 标记清除算法

标记清除算法通过标记所有从根对象(通常是全局对象)可达的对象,然后清除未标记的对象来回收内存。

二、 限定条件

JavaScript的垃圾回收机制主要涉及对象的管理,而基本数据类型通常不涉及垃圾回收,因为它们是简单的值,而不是对象。JavaScript的垃圾回收机制更关注于复杂数据类型,如对象和数组。

  1. 数字(Number): 基本数据类型的数字是不需要垃圾回收的,因为它们只是简单的数值,没有引用其他对象或数据。
let x = 42; // 基本数据类型的数字
  1. 字符串(String): 基本数据类型的字符串也不需要垃圾回收,因为它们是不可变的,没有内部引用需要跟踪。
 let name = "John"; // 基本数据类型的字符串
  1. 布尔值(Boolean): 基本数据类型的布尔值也不需要垃圾回收,因为它们只表示真或假。
let isLogged = true; // 基本数据类型的布尔值
  1. 空值(null)和未定义(undefined): 这些特殊的基本数据类型表示缺少值或未定义的值。它们也不需要垃圾回收。
let emptyValue = null; // 空值
let undefinedValue; // 未定义

三、做练习题

1. 引用计数算法

// 把 {name: ‘John’} 代指A
//  A 对象被obj1 引用1次,A 引用计数=1次
let obj1 = { name: 'John' };
//  A 对象被obj2 引用1次,A 引用计数=2次
let obj2 = obj1; 


// 解除obj1 的引用对象A, A 引用计数 = 1 次
obj1 = null;
// 解除obj2 的引用对象A, A 引用计数 = 0 次
obj2 = null; 

// 对象A 没有被任何变量引用,将被垃圾回收机制回收

总结归纳:

  1. 引用计数是指一个对象的堆内存空间被引用了几次
  2. 通过=号,给变量赋值对象,引用增加
  3. 通过=号,给变量赋值为null, 解除对象的引用

2-1. 循环引用

function createCircularReference() {
  // 把 {} 代指 A, A 被obj1 引用1次, A的引用计数 = 1次
  let obj1 = {}; // 
  // 把 {} 代指 B, B 被obj1 引用1次, B的引用计数 = 1次
  let obj2 = {}; // 
  // B 被 obj1.circularRef 引用1次, B的引用计数 = 2次
  obj1.circularRef = obj2; 
  // A 被 obj2.circularRef 引用1次, A的引用计数 = 2次
  obj2.circularRef = obj1; 
  // 这里有一个循环引用,即obj1和obj2互相引用
}

// 当函数执行完毕后,obj1和obj2都会离开作用域,
// 但由于它们互相引用,它们的引用计数不会降为零,
// 垃圾回收需要检测和处理这种循环引用```

总结归纳:

  1. 循环引用,引用计数不会降为零
  2. 循环引用是通过两个对象的属性,相互赋值另外一个对象,实现相互引用

1和2-1对比归纳:

  1. 大括号中无论是否有值,都会开辟新的内存空间
  2. 绑定引用和解除引用都使用=号,

2-2. 手动解除引用

你可以通过将循环引用的其中一个对象设置为null来手动解除引用。这将打破循环引用,允许垃圾回收器正确地识别这些对象并释放它们。

// 循环引用
const obj1 = {};
const obj2 = {};
obj1.ref = obj2;
obj2.ref = obj1;

// 手动解除引用obj1.ref = null;
obj2.ref = null;

总结归纳:

  1. 绑定引用和解除引用的属性或对象,要保持一致性

2-3. WeakMap和WeakSet 解除引用

JavaScript提供了WeakMap和WeakSet数据结构,它们允许你存储弱引用(不会阻止垃圾回收的引用)。这些数据结构不会阻止对象被回收,因此可以用于解决循环引用问题。当你不再需要这些引用时,它们会自动被垃圾回收

const obj1 = {};
const obj2 = {};

const weakMap = new WeakMap();
weakMap.set(obj1, obj2);
weakMap.set(obj2, obj1);

// 当不再需要循环引用时,它们会被自动释放

总结归纳:

  1. 使用 weakMap方法,内存变成弱引用,不受引用计数的影响,自动被回收站回收。

3. 标记清除算法

标记清除算法通过标记所有从根对象(通常是全局对象)可达的对象,然后清除未标记的对象来回收内存。

// 标记所有能够从根对象访问到的对象,通常包括全局变量、当前调用栈中的变量等。标记的对象会被标记为“活动”
function createUser() {
  let user = {
    name: 'Alice',
    age: 30  
  };
  return user;
}
// 遍历:垃圾回收器遍历整个对象图,标记所有与活动对象相互引用的对象,以确保不会因为被引用而被清除。
let userData = createUser(); 
// 现在userData不再引用对象
userData = null; 

// 当userData变为null后,活动对象被解除引用
// 垃圾回收会将这个对象createUser()清除

总结归纳:

  1. 标记全局变量下对象,为活动对象
  2. 遍历查询出,哪些活动对象被引用,防止被垃圾回收

总结规律:

  1. 引用计数是指一个对象的堆内存空间被引用了几次
  2. 通过=号,给变量赋值对象,引用增加
  3. 通过=号,给变量赋值为null, 解除对象的引用
  4. 循环引用是通过两个对象的属性,相互赋值另外一个对象,实现相互引用
  5. 循环引用,引用计数不会降为零
  6. 手动解除引用,通过把基本数据类型赋值给变量,解除变量和对象的引用关系
  7. 对象弱引用,使用weakMap和WeakSet方法实现两个对象的弱引用,使用完成后允许垃圾回收
  8. 标记全局变量下对象,为活动对象
  9. 遍历查询出,哪些活动对象被引用,防止被垃圾回收

四、建立新学的知识与旧知识之间的关联

1. js的垃圾回收机制和 delete 删除对象的属性

  1. js的垃圾回收机制,把代码中没有被引用的对象,自动清除该对象所占用的内存空间;delete 删除对象的属性
  2. 两者之间的区别
  • 一个清除未被引用对象的内存空间;一个是删除对象的属性
  • 一个自动清除;一个是手动删除
  • 两者的本质:都是清除掉不需要的东西,达成某个功能
// {name:'xiao'} 被obj1 引用1次,{name:'xiao'} 的引用计数 = 1
let obj1 = {name:'xiao'} 
// 解除 ob1 和 {name:'xiao'} 引用关系, {name:'xiao'}的引用计数 = 0, {name:'xiao'} 将被垃圾回收
obj1 = null
let params = {
	id: 123,
	name: 'xiao'
	phone: '123456789'
}
// 业务需求是,新增时,删除id
if (state === 'add'){
	delete params.id
}

2. 引用计数算法(暂时想不到与那个旧知识关联,日后补充)

3. 标记清除算法(暂时想不到与那个旧知识关联,日后补充)

五、 转换表述

1. js的垃圾回收机制

垃圾回收机制,就是我们平时去吃火锅时,每一盘菜就是就是一个正在被使用的内存,当菜被吃完后,服务员会把空盘子自动拿走,以保证桌面整洁和提高用户体验。
在这里插入图片描述

2. 引用计数算法

引用计数算法就像我们吃完火锅,一包卫生纸盒,给每个人都发一张,直到卫生纸都发完了,只剩下空纸盒,它就会被垃圾回收。引用计数的本质是,该物品(或对象)对某人或事物,还有没有它的价值。
在这里插入图片描述

3. 循环引用

循环引用就是两个正在热恋的年轻人,两个人相互吸引,都离不开对方,脑海中无时无刻在想着对方,所以引用计数永远不会为零,直到他们分手时,他们之间的引用计数才会变成0
在这里插入图片描述

4. 标记清除算法

标记清除算法就是书桌上有很多东西,比如零食、玩具、书本、笔,然后现在妈妈让你写作业,把无关的东西收拾起来,零食、玩具就会被收拾起来(垃圾回收)。
标记清除算法的本质,把没有使用的东西清除掉。

在这里插入图片描述

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

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

相关文章

【RocketMQ】路由中心NameServer

【RocketMQ】路由中心NameServer 参考资料: RocketMQ Nameserver 背后的设计理念 RocketMQ之NameServer详解 深入剖析RocketMQ源码-NameServer —— vivo互联网技术 《RocketMQ技术内幕》 文章目录 【RocketMQ】路由中心NameServerNameServer架构设计NameServer工作…

上海亚商投顾:沪指震荡调整 两市成交金额跌破6000亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日集体调整,创业板指续创3年多以来新低。ST板块继续走强,*ST柏龙、ST恒久等…

笔记2.2:网络应用基本原理

一. 网络应用的体系结构 (1)客户机/服务器结构(Client-Server, C/S) (2)点对点结构(Peer-to-Peer,P2P) (3)混合结构(Hybrid&#x…

leetcode646. 最长数对链(java)

最长数对链 题目描述贪心解法二 动态规划 dp 题目描述 难度 - 中等 leetcode646. 最长数对链(java) 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅…

数字散斑干涉测量仿真研究

一、引言 数字散斑干涉技术(digital speckle pattern interferometry&#xff0c;DSPI)是一种测量物体表面微小变形的测量技术&#xff0c;在生物医学检测、缺陷无损检测、精密制造、材料与结构力学参数评估等领域起着日益重要的作用&#xff0c;具有实时性、高精度、非接触、…

npm、yarn、pnpm如何清除缓存?

前端工程化创建项目会经常使用各种安装包管理工具&#xff0c;安装各种前端依赖包。例如&#xff0c;npm、yarn、pnpm等。时间一长&#xff0c;各种安装包管理工具的在安装依赖时&#xff0c;留下的缓存文件就会变得很大&#xff0c;以至于影响系统的运行&#xff0c;因此必要时…

kdxf speex

speex import subprocess# 定义FFmpeg命令 ffmpeg_command [ffmpeg,#-f, dshow,-i, rd:\tug\iat_mp3_16k.mp3,-acodec, speex,-ar, 16000,-ab, 16000,-ac, 1,output.spx ] spxcmdspxTest -enc 16000 7 1280 D:\\tug\iat_pcm_16k.pcm 1.speex #ffmpeg -f dshow -i audio"…

易优cms安装插件时显示空白一片处理方法

检查网站权限是否自己改过&#xff0c;看下图操作

camera驱动层和硬件层简介

目录 Camera Driver 1. V4L2 框架简介 1&#xff09;关键结构体 2&#xff09;模块初始化 3&#xff09;处理用户空间请求 2. 高通KMD框架详解 1&#xff09;概览 2&#xff09;核心模块解析 3&#xff09;模块初始化 4&#xff09;处理UMD CSL请求 Camera Hardware…

孤网双机并联逆变器下垂控制策略MATLAB仿真模型

微❤关注“电气仔推送”获得资料 主体模块&#xff1a; 建议使用MATLAB2021b及以上版本打开&#xff01; 功率计算模块、下垂控制模块、电压电流双环控制模块 系统输出有功功率: 系统输出无功功率&#xff1a; 系统频率变化曲线: 参考文献&#xff1a; 微电网并网运行模式下…

智慧燃气管网监控预警系统探析

关键词&#xff1a;智慧燃气、智能管网、智慧燃气系统、智能燃气、燃气监控、数据挖掘 “智慧城市”是我国当前城市发展的新理念&#xff0c;“智慧城市”离不开天然气等清洁能源的普及和发展&#xff0c;在这一理念的指引下&#xff0c;我国城市的燃气使用普及率和使用范围都…

2023-09-20 Teaching Note for Class 1

文章目录 1. Sign-in Result2. Content of Course3. History of Computer4. Free Topic 1. Sign-in Result Let’s take a look at the sign-in result Everybody is here. 2. Content of Course the course consists of eight modules 3. History of Computer 4. Free To…

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows 大家好我是艾西&#xff0c;最近研究了下 l4d2&#xff08;求生之路2&#xff09;这款游戏的搭建以及架设过程。今天就给喜欢l4d2这款游戏的小伙伴们分享下怎么搭建架设一个自己的服务器。毕竟自己当服主是热爱游…

基于matlab实现的光折射反射(不同界面)程序

完整程序: %平面电磁波在不同介质界面上入射、反射、折射仿真 %ReadMe!!!在下述说明的用户输入区内输入入射角和两介质折射率&#xff0c; %输出反射折射示意图与反射折射系数随入射角变化的曲线 %—————————————————————————————————————…

我想设计一套游戏的奖励系统,有什么值得注意的?

游戏上&#xff1a; 游戏成就系统的价值 游戏中的成就可以延长游戏时间&#xff0c;让玩家不仅仅是将游戏通关&#xff0c;而是必须完成游戏内所有挑战及发现秘密&#xff0c;这些成就可以与游戏本身的目标一致&#xff0c;也可以独立于游戏的主要或次要目标之外&#xff0c;…

flink集群与资源@k8s源码分析-资源III 声明式资源管理

1 资源 资源分析分3部分,资源请求,资源提供,声明式资源管理,本文是第三部分声明式资源管理 2 检查资源需求/检查资源声明 检查资源需求/检查资源声明是flink声明式资源管理的核心方法 上面的资源场景分为两类,提出资源需求和提供资源, 检查资源请求/检查资源声明是交…

Unity HDRP 录制透明通道序列帧

一、插件 使用插件为Unity Recorder&#xff0c;可在PackageManager搜索Recorder安装 然后打开插件面板 二、Image Sequence 添加Image Sequence&#xff0c;摄像机选择主摄即可&#xff0c;图片格式选PNG&#xff0c;并勾选Include Alpha 此时点击 START RECORDING 即可…

Linux常用命令 - 用户管理命令

用户管理命令 useradd 功能&#xff1a;添加用户。 选项功能-d指定用户主目录-m创建用户的主目录-g指定用户的用户组-s指定用户的shell-D显示useradd命令当前的默认值 不同的linux系统默认选项不一样&#xff0c;比如Ubuntu系统useradd命令默认只创建用户&#xff0c;不会创…

Spring Boot虚拟线程的性能还不如Webflux?

早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章&#xff0c;觉得还不错。内容较长&#xff0c;抓重点给大家介绍一下这篇文章的核心内容&#xff0c;方便大家快速阅读。 测试场景 作者采用了一个尽可能贴近现实操作的场景&#xff1a; 从授权头信息中提取JWT验证…

SpringBoot3基础:最简项目示例

说明 本文建立一个最基本的SpringBoot3项目&#xff0c;依赖项仅包含 spring-web&#xff08;SpringMVC&#xff09;。 备注&#xff1a;SpringBoot3需要JDK17支持&#xff0c;配置方法参考&#xff1a; SpringBoot3项目中配置JDK17 项目结构图示 POM <?xml version&qu…