当前位置: 首页 > 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()

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

http://www.lryc.cn/news/301628.html

相关文章:

  • 【快速解决】python项目打包成exe文件——vscode软件
  • 数据结构——lesson3单链表介绍及实现
  • 中科大计网学习记录笔记(八):FTP | EMail
  • QPaint绘制自定义坐标轴组件00
  • MATLAB|基于改进二进制粒子群算法的含需求响应机组组合问题研究(含文献和源码)
  • JDBC核心技术
  • 【天幕系列 02】开源力量:揭示开源软件如何成为技术演进与社会发展的引擎
  • “挖矿”系列:细说Python、conda 和 pip 之间的关系
  • 【自然语言处理】实验3,文本情感分析
  • 2.12日学习打卡----初学RocketMQ(三)
  • <网络安全>《35 网络攻防专业课<第一课 - 网络攻防准备>》
  • 【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)
  • 蓝桥杯Java组备赛(二)
  • 人力资源智能化管理项目(day10:首页开发以及上线部署)
  • Conda管理Python不同版本教程
  • free pascal:fpwebview 组件通过 JSBridge 调用本机TTS
  • 数据结构——单链表专题
  • Linux:开源世界的王者
  • ⭐北邮复试刷题103. 二叉树的锯齿形层序遍历 (力扣每日一题)
  • 文件上传漏洞--Upload-labs--Pass07--点绕过
  • MySQL高级特性篇(1)-JSON数据类型的应用
  • 如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口
  • ViT: transformer在图像领域的应用
  • Sora 的工作原理(及其意义)
  • Java学习笔记2024/2/16
  • XLNet做文本分类
  • Swift 5.9 新 @Observable 对象在 SwiftUI 使用中的陷阱与解决
  • 分享一个学英语的网站
  • 【动态规划】【C++算法】2742. 给墙壁刷油漆
  • 【后端高频面试题--设计模式上篇】