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

前端面试宝典---js垃圾回收机制

什么是垃圾回收

垃圾回收是指一种自动内存管理机制,当声明一个变量时,会在内存中开辟一块内存空间用于存放这个变量。当这个变量被使用过后,可能再也不需要它了,此时垃圾回收器会自动检测并回收这些不再使用的内存空间。垃圾回收的主要目的是释放不再使用的内存,提高内存的使用效率,避免内存泄漏。

垃圾回收的两种算法

标记清除算法

标记清除算法的工作过程可以分为两个阶段:
标记阶段:从根对象(在JS中就是全局对象)开始,遍历所有可达的对象,并标记它们。
清除阶段:清除所有未被标记的对象,这些对象被认为是"垃圾",可以被安全地回收。

这个过程可以想象成从根部溢出一大桶油漆,油漆流经所有引用并标记所有可达的对象。然后移除未被标记的对象

引用计数算法

引用计数算法的工作原理如下:

  1. 每当有一个新的引用指向该对象时,计数加一。
  2. 当引用被删除或重新赋值时,计数减一。
  3. 当计数为零时,表示该对象不再被任何其他对象引用,可以被安全地回收。

引用计数算法的优点是能够在对象变成垃圾的那一刻立即回收,不需要等待定期扫描。然而,它无法处理对象之间的循环引用问题,容易导致内存泄漏

两种算法比较

标记清除算法和引用计数算法各有优缺点:

标记清除算法:
优点:能够处理对象之间的循环引用问题
缺点:可能导致性能问题,需要定期扫描整个内存空

引用计数算法:
优点:能够在对象变成垃圾的那一刻立即回收
缺点:无法处理对象之间的循环引用问题,容易导致内存泄漏

V8引擎的垃圾回收机制

分代式垃圾回收机制将内存分为新生代和老生代两部分:

新生代:处理短期存活的对象,内存最大值在64位系统和32位系统上分别为32MB和16MB。新生代又会分为两个半区(from和to两个区)
老生代:处理长期存活的对象。
在这里插入图片描述

新生代垃圾回收

当新生代的from空间快达到上限时,会触发一次垃圾回收。垃圾回收器会从根部开始遍历,不可达对象(即无法遍历到的对象)将会被回收,并把空间中的剩余对象移动到to空间。最后把from空间清空。
此时to空间变成新的from空间,from空间变成新的to空间。

新生代=》老生代

如果对象在新生代中存活了一定次数(通常是15次),它会被晋升到老生代。

老生代垃圾回收

当老生代的内存空间快达到上限时,V8引擎使用标记-清除(Mark-Sweep)、标记-压缩(Mark-Compact)算法。

  1. 把老生代所有的对象标记成0,并把可达的对象标记成1
  2. 清除0的对象
  3. 把剩余的对象标记置0
  4. 并用标记-压缩算法将位置重新排序变得紧密

在这里插入图片描述
在这里插入图片描述

http://www.xdnf.cn/news/437689.html

相关文章:

  • “海外滴滴”Uber的Arm迁移实录:重构大规模基础设施​
  • 知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑
  • 广东省省考备考(第十天5.14)—言语(第三节课)
  • deepseek梳理java高级开发工程师算法面试题
  • C++23 中的 ranges::starts_with 与 ranges::ends_with
  • Go语言中的函数类型参数:深入理解`func()`
  • 编程日志5.6
  • 比亚迪固态电池突破:王传福的技术哲学与产业重构|创客匠人热点评述
  • 部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm
  • PyQt5基本窗口控件(QComboBox(下拉列表框))
  • AI开发者的算力革命:GpuGeek平台全景实战指南(大模型训练/推理/微调全解析)
  • 注解和 XML 两种方式有什么区别?
  • hudi + flinksql 处理 金额汇总的实时场景
  • Flink实时统计任务CPU异常排查与解决方案
  • Thrust库中的Gather和Scatter操作
  • 【​​HTTPS基础概念与原理​】​​HTTPS vs HTTP:为什么现代网站必须用HTTPS?
  • 元宇宙赛道新势力:成都芯谷产业园创新业务如何重构产业格局
  • 5.18-AI分析师
  • 【RabbitMq C++】消息队列组件
  • 人工智能外呼系统:重构智能交互的全维度进化
  • ORACLE查看归档是否打开
  • 海量数据Top k 与查重问题
  • JavaScript篇:揭秘函数式与命令式编程的思维碰撞
  • 基于Python的量化交易实盘部署与风险管理指南
  • XD08M3232接近感应单片机的接近感应模块的工作原理
  • VTK|类似CloudCompare的比例尺实现2-vtk实现
  • DML和DQL
  • 基于 GPUGEEK平台进行vLLM环境部署DeepSeek-R1-70B
  • 从零开始学习three.js(16):一文详解three.js中的法向量Normal Vector
  • FPGA在光谱相机中的核心作用