返回顶部
首页 > 资讯 > 前端开发 > 其他 >深入浅析JS中的垃圾回收机制
  • 469
分享到

深入浅析JS中的垃圾回收机制

javascript垃圾回收机制 2023-05-14 22:05:00 469人浏览 安东尼
摘要

基本类型存放在栈中,引用类型存放在堆中。javascript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。垃圾回收策略所有垃圾回收器都需要做的任务标记空间中活动(存活)对象和非

基本类型存放在栈中,引用类型存放在堆中。javascript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。

深入浅析JS中的垃圾回收机制

垃圾回收策略

所有垃圾回收器都需要做的任务

  • 标记空间中活动(存活)对象和非活动(非存活)对象

  • 回收或者重用被非活动对象占据的内存

  • 内存整理,防止内存碎片的出现

什么是垃圾对象?

一般来说没有被引用的对象就是垃圾,就是要被清除。从根开始遍历对象。

例外
如果几个对象引用形成一个环,互相引用,但根访问不到它们,这几个对象也是垃圾,也要被清除。

什么是根对象和存活对象

根对象
有一组基本的固有可达值,由于显而易见的原因无法删除

  • 全局变量 window全局对象、DOM文档树根对象等

存活对象
如果引用或引用链可以从根访问任何其他值,则认为该值是可访问的

V8引擎回收 分代回收法

将堆分为新生代和老生代。
新生代中存放的是生存时间短的对象,老生代中存放的生存时间久的对象。

新生代垃圾回收器 scavenge复制算法

堆内存分为两部分,一个是使用区,处于使用状态的空间;另一个是空闲区,处于空闲状态的空间。

  • 新加入的对象会存放到使用区,当使用区快被写满时,就需要进行垃圾清理操作。

  • 新生代垃圾回收器会对使用区的活动对象对象做标记,标记完成之后将使用区的活动对象复制到空闲区。解决了内存散落分块的问题。

  • 将使用区的非活动对象占用的空间清理掉。最后进行角色互换,原来的使用区变成新的空闲区,原来的空闲区变成新的使用区。

移动到老生代的对象

  • 如果一个对象多次复制后仍然存活,将被认为时生命周期较长的对象,随后被移动到老生代中。
  • 复制一个对象到空闲区时,占用空闲区空间超过了25%,这个对象会被直接晋升到老生代空间中。原因是原来的空闲区会变成新的使用区,继续进行对象内存的分配,若占比过高,新对象的可用空间太少。

新生代优化 并行回收

全停顿问题
JavaScript是单线程语言,运行在主线程上,进行垃圾回收时会阻塞JavaScript脚本的执行,需要等待垃圾回收完毕后再恢复脚本执行。

如果一次GC的时间过长,可能造成页面卡顿现象。

并行回收机制
垃圾回收器在主线程上执行的过程中,开启多个辅助线程,同时执行同样的回收工作。

在这里插入图片描述

老生代垃圾回收

使用scavenge方式存在的问题
1.存活对象较多,频繁复制存活对象效率将降低
2.浪费一半空间

主要采用标记-清除法,在内存分配不足时,采用标记-整理

老年代垃圾回收期采用的算法
1. 首先使用标记-清除完成垃圾空间的回收;
2. 采用标记-整理进行空间优化
3. 采用优化-增量标记与惰性清理进行效率优化;

标记-清除 与 标记-整理 算法

scavenge只复制活着的对象,而标记-清除只清除死了的对象。
活对象在新生代中只占较少部分,死对象在老生代中只占较少部分,这就是两种回收方式都能高效处理的原因

缺点
内存碎片太多。如果出现需要分配一个大内存的情况,由于剩余的碎片空间不足以完成此次分配,就会提前触发垃圾回收,而这次回收是不必要的。

-> 标记-整理算法 标记完存活对象后,将存活对象向内存空间的一端移动,移动完成后,清除掉边界外的所有内存

优化-增量标记与惰性清理

增量标记

如果有很多对象,并且我们试图一次遍历并标记整个对象集,那么可能会花费一些时间,并在执行中会有一定的延迟。因此,引擎试图将垃圾回收分解为多个部分。然后,各个部分分别执行。

V8对老生代垃圾回收器进行了优化,从全停顿标记切换到增量标记
将一次垃圾回收变成一小段一小段GC垃圾回收
在这里插入图片描述
如果采用非黑即白(存活和死亡)的标记策略,那在垃圾回收器执行了一段增量回收后,暂停后启用主线程去执行了应用程序中的一段 JavaScript 代码,随后当垃圾回收器再次被启动,这时候内存中黑白色都有,我们无法得知下一步走到哪里了

惰性清理

增量标记完成后,惰性清理就开始了。当增量标记完成后,假如当前的可用内存足以让我们快速的执行代码,其实我们是没必要立即清理内存的,可以将清理过程稍微延迟一下,让 JavaScript 脚本代码先执行,也无需一次性清理完所有非活动对象内存,可以按需逐一进行清理直到所有的非活动对象内存都清理完毕,后面再接着执行增量标记

三色标记法 暂停和恢复

三色标记法的 mark 操作可以渐进执行的而不需每次都扫描整个内存空间,可以很好的配合增量回收进行暂停恢复的一些操作,从而减少 全停顿 的时间

  • 白色:未被标记的对象
  • 灰色:自身被标记,该对象的引用对象未被标记
  • 黑色:自身和该对象的引用对象(箭头指的对象)都被标记

在这里插入图片描述
从一组根对象开始,先将这组根对象标记为灰色并推入到标记工作表中,当回收器从标记工作表中弹出对象并访问它的引用对象时,将其自身由灰色转变成黑色,并将自身的下一个引用对象转为灰色

就这样一直往下走,直到没有可标记灰色的对象时,也就是无可达的对象了,那么剩下的所有白色对象都是无法到达的,即等待回收。

当前内存中有没有灰色节点来判断整个标记是否完成,如没有灰色节点,直接进入清理阶段,如还有灰色标记,恢复时直接从灰色的节点开始继续执行就可以

写屏障

一次完整的GC标记分块暂停后,执行任务程序,修改了对象的引用关系。
在这里插入图片描述
假设在第一次增量分段中全部将ABC标记为黑色,然后执行JavaScript脚本,将B->D,开始执行第二次增量分段。

新对象D是初始的白色,但是此时没有灰色对象了,也就是全部标记完成需要开始清理了,D将会在清理阶段被回收。这是不对的。
V8引入写屏障机制,一旦有黑色对象引用白色对象,该机制就将引用的白色对象变为灰色

并发回收
  • 并行回收会阻塞主线程
  • 增量标记增加了总暂停时间、降低应用程序吞吐量

主线程在执行 JavaScript 的过程中,辅助线程能够在后台完成执行垃圾回收的操作
在这里插入图片描述

【推荐学习:javascript高级教程

以上就是深入浅析js中的垃圾回收机制的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 深入浅析JS中的垃圾回收机制

本文链接: https://lsjlt.com/news/207077.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 深入浅析JS中的垃圾回收机制
    基本类型存放在栈中,引用类型存放在堆中。JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。垃圾回收策略所有垃圾回收器都需要做的任务标记空间中活动(存活)对象和非...
    99+
    2023-05-14
    javascript 垃圾回收机制
  • 深入浅析Java 中的可视化垃圾回收机制
    这期内容当中小编将会给大家带来有关深入浅析Java 中的可视化垃圾回收机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。基础当谈到释放不再使用的内存,垃圾回收已经在很大程度上取代了早期技术,比如手动内存管...
    99+
    2023-05-31
    java 可视化 ava
  • 深入剖析 JavaScript 垃圾回收机制
    机制 JavaScript 使用“标记-清除”垃圾回收算法: 标记阶段:垃圾回收器遍布应用程序的内存,并标记所有仍在被使用的对象。 清除阶段:垃圾回收器释放所有未标记的对象占用的内存。 垃圾回收触发器 JavaScript 垃圾回收在...
    99+
    2024-04-02
  • 深入了解JavaScript中的垃圾回收机制
    JavaScript中的垃圾回收机制负责自动管理内存,回收不再使用的对象所占用的内存空间。在JavaScript中,开发者不需要显式地分配和释放内存,垃圾回收器会自动完成这些操作。以...
    99+
    2023-05-15
    JavaScript垃圾回收机制 JavaScript垃圾回收
  • js中垃圾回收机制的示例分析
    这篇文章主要介绍了js中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。原理找到不再被使用的变量,然后释放其占用的内存,...
    99+
    2024-04-02
  • 深入了解PHP的垃圾回收机制
    本篇文章给大家带来了关于PHP的相关知识,主要介绍了PHP垃圾回收机制讲解,通过简要的案例,详细讲解了该机制的原理与使用,以下就是详细内容,需要的朋友可以参考下。(推荐教程:PHP视频教程)一、引用计数基础知识每个php变量存在一个叫 zv...
    99+
    2024-04-02
  • 浅谈Java垃圾回收机制
    目录一.什么是垃圾二.怎么回收垃圾2.1 静态对象什么时候变成垃圾被回收2.2 新生代和年老代三、垃圾回收算法3.1 标记清除算法3.2 复制清除算法(专门用于处理年轻代垃圾的)3....
    99+
    2024-04-02
  • 浅谈Python的垃圾回收机制
    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。 #en...
    99+
    2022-06-04
    浅谈 机制 垃圾
  • 深入理解Go语言中的垃圾回收机制
    Go语言中的垃圾回收(GC)机制是自动进行的,开发者不需要手动管理内存。这种自动化垃圾回收机制可以帮助开发者降低内存泄漏的风险,并减...
    99+
    2023-10-08
    Golang
  • 垃圾回收机制
      我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是...
    99+
    2023-01-30
    机制 垃圾
  • js中垃圾回收机制如何优化
    这篇文章主要介绍js中垃圾回收机制如何优化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、数组array优化将[]赋值给一个数组对象,是清空数组的捷径(例如: arr = [];),但是需要注意的是,这种方式又创建...
    99+
    2023-06-15
  • 分析PHP的垃圾回收机制
    如果用过C语言,那么申请内存的方式是malloc或者是calloc,然后你用完这个内存后,一定不要忘了用free函数去释放掉,这就是传说中手动垃圾回收,一般都是扫地神僧用这种方式。很...
    99+
    2024-04-02
  • JS中的垃圾回收机制怎么理解
    这篇“JS中的垃圾回收机制怎么理解”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS中的垃圾回收机制怎么理解”文章吧。基本类...
    99+
    2023-07-05
  • JavaScript中的垃圾回收机制
    聚沙成塔·每天进步一点点 ⭐ 专栏简介⭐ JavaScript的垃圾回收机制⭐ 内存管理⭐ 引用计数⭐ 标记-清除算法⭐ 内存泄漏⭐ 性能优化⭐ 使用`delete`操作符⭐ 注意循环中的变量...
    99+
    2023-10-05
    javascript 开发语言 ecmascript
  • GC垃圾回收机制
    GC垃圾回收机制 一、 GC原理:1、为什么进行垃圾回收 二、JVM与回收算法:1、内存分配2、回收算法1、标记-清除(Mark-sweep)2、复制(Copying)3、标记-整理(Ma...
    99+
    2023-09-24
    jvm java 算法
  • day09(垃圾回收机制)
    1,复习 文件处理 1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...
    99+
    2023-01-31
    机制 垃圾
  • python垃圾回收机制!
    python的三种垃圾回收机制:1.python采用的是引用计数机制为主;2.标记-清除;为辅的策略3.分代收集(隔代回收、分代回收)为辅的策略 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内...
    99+
    2023-01-31
    机制 垃圾 python
  • PHP的垃圾回收机制
      一、原理 php5和php7的垃圾回收机制都是利用引用计数。 二、php5和php7不同点 1、PHP5标量数据类型会计数,PHP7标量数据类型不再计数,不需要单独分配内存。 2、PHP7的zval 需要的内存不再是单...
    99+
    2016-04-04
    PHP的垃圾回收机制
  • JavaScript垃圾回收机制原理总结深入探究
    目录1. 垃圾为何要产生并回收2. 垃圾回收机制2.1 标记清除法2.2 引用计数法3. V8对垃圾回收机制的优化——分代式垃圾回收机制3.1 新生代与老生代...
    99+
    2022-11-13
    JavaScript垃圾回收 JS垃圾回收机制
  • PHP中垃圾回收机制的示例分析
    小编给大家分享一下PHP中垃圾回收机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如果用过C语言,那么申请内存的方式是malloc或者是calloc,...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作