当前位置: 首页 > 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.dtcms.com/a/189634.html

相关文章:

  • 大模型越狱:技术漏洞与安全挑战——从原理到防御
  • 生活实用小工具-手机号归属地查询
  • Jsp技术入门指南【十四】实现基于MySQL+JDBC+JSP数据库验证的登录界面与登录跳转功能
  • 文章记单词 | 第74篇(六级)
  • 16S18S基础知识(1)
  • OpenHarmony平台驱动开发(十七),UART
  • 【vue】脚手架
  • UniApp 微信小程序绑定动态样式 :style 避坑指南
  • 2025年6月一区SCI-不实野燕麦优化算法Animated Oat Optimization-附Matlab免费代码
  • day014-服务管理
  • SpringbBoot nginx代理获取用户真实IP
  • Mac的web服务器
  • Python解释器、REPL与脚本的区别
  • 适用于 iOS 的 开源Ultralytics YOLO:应用程序和 Swift 软件包,用于在您自己的 iOS 应用程序中运行 YOLO
  • 多因子线性回归实战
  • Spark缓存---cache方法
  • 【前端】:单 HTML 去除 Word 批注
  • 【嵌入式开发-软件定时器】
  • nginx 出现大量connect reset by peer
  • 二分查找的边界问题
  • Python训练营打卡——DAY25(2025.5.14)
  • [论文阅读]Formalizing and Benchmarking Prompt Injection Attacks and Defenses
  • MySQL 学习(九)bin log 与 redo log 的区别有哪些,为什么快速恢复使用 redo log 而不用 bin log?
  • 基于javaweb的SpringBoot高校图书馆座位预约系统设计与实现(源码+文档+部署讲解)
  • 深度强化学习 | 图文详细推导软性演员-评论家SAC算法原理
  • html js 原生实现web组件、web公共组件、template模版插槽
  • Go 语言 sqlx 库使用:对 MySQL 增删改查
  • 破解商业综合体清洁管理困局:商业空间AI智能保洁管理系统全场景解决方案
  • 知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑
  • Flink CDC—实时数据集成框架