当前位置: 首页 > news >正文

JS进阶——垃圾回收机制以及算法

版权声明

本文章来源于B站上的某马课程,由本人整理,仅供学习交流使用。如涉及侵权问题,请立即与本人联系,本人将积极配合删除相关内容。感谢理解和支持,本人致力于维护原创作品的权益,共同营造一个尊重知识产权的良好环境。

内存的生命周期

JS环境中分配的内存,一般有如下生命周期:

  • 内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存
  • 内存使用:即读写内存,也就是使用变量、函数等 
  • 内存回收:使用完毕,由垃圾回收器自动回收不再使用的内存

JS垃圾回收机制—算法说明

堆栈空间分配区别:

1.栈(操作系统):由操作系统自动分配释放函数的参数值、局部变量等,基本数据类型放到栈里面。

2.堆(操作系统):一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。复杂数据类型放到堆里面。

引用计数

IE采用的引用计数算法,定义“内存不再使用”,就是看一个对象是否有指向它的引用,没有引用了就回收对象算法:

const arr = [1,2,3,4]
arr = null
let person = {age: 20,name: '松果'
}
let p = person
person = 1
p = null

引用计数存在一个致命问题:(循环引用)

如果两个对象互相引用,尽管他们已不再使用,垃圾回收器不会进行回收,导致内存泄漏。

function fn() {let o1 = {}let o2 = {}o1.a =o2o2.a =o1return '引用计数无法回收'
}
fn()

标记清除法

现代的浏览器已经不再使用引用计数算法了。

现代浏览器通用的大多是基于标记清除算法的某些改进算法,总体思想都是一致的。核心:

1.标记清除算法将“不再使用的对象”定义为“无法达到的对象”。

2.就是从根部(在JS中就是全局对象)出发定时扫描内存中的对象。凡是能从根部到达的对象,都是还需要使用的。3.那些无法由根部出发触及到的对象被标记为不再使用,稍后进行回收。

 

function fn() {let o1 = {}let o2 = {}o1.a =o2o2.a =o1return '引用计数无法回收'
}
fn()

 根部已经访问不到,所以自动清除

相关文章:

  • 【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】
  • Rust 学习笔记 - 变量声明与使用
  • 用C语言列出Linux或Unix上的网络适配器
  • 5.9 BCC工具之nodejs_http_server.py简介
  • [前端开发] 常见的 HTML CSS JavaScript 事件
  • aiofiles:解锁异步文件操作的神器
  • Unity类银河恶魔城学习记录7-6 P72 Bouncy sword源代码
  • LLM之LangChain(七)| 使用LangChain,LangSmith实现Prompt工程ToT
  • 树与二叉树---数据结构
  • bat脚本 创建计划任务 一分钟设置ntp同步周期为60s
  • Gin框架: 快速搭建起一个Web应用环境及处理不同类型的响应
  • wordpress外贸成品网站模板
  • 二叉树相关OJ题
  • Python编程中的异常处理
  • 利用Excel模拟投币试验
  • 「面试题」如何实现一个圣杯布局?
  • 【刷算法】求1+2+3+...+n
  • 〔开发系列〕一次关于小程序开发的深度总结
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JS实现简单的MVC模式开发小游戏
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • MQ框架的比较
  • mysql常用命令汇总
  • MySQL-事务管理(基础)
  • MySQL数据库运维之数据恢复
  • Objective-C 中关联引用的概念
  • Python学习笔记 字符串拼接
  • Python语法速览与机器学习开发环境搭建
  • Spring-boot 启动时碰到的错误
  • Windows Containers 大冒险: 容器网络
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 关于for循环的简单归纳
  • 关于使用markdown的方法(引自CSDN教程)
  • 机器学习中为什么要做归一化normalization
  • 跨域
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前言-如何学习区块链
  • 浅谈web中前端模板引擎的使用
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 数据科学 第 3 章 11 字符串处理
  • 微信小程序:实现悬浮返回和分享按钮
  • 项目实战-Api的解决方案
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 大数据全解:定义、价值及挑战
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (轉貼) UML中文FAQ (OO) (UML)
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息