JS垃圾回收机制

这篇具有很好参考价值的文章主要介绍了JS垃圾回收机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一些名词的解释

什么是性能优化?

提高运行效率,降低运行开销的行为都可以看做性能优化。

js语言本身的优化,实现编写高效率的代码。

什么是内存管理?

内存:由可读写单元组成,表示一片可操作空间

管理:人为的去操作一片空间的申请、使用和释放

内存管理:开发者主动申请空间、使用空间、释放空间

管理流程:申请 -> 使用 -> 释放

js的内存空间在定义变量时自动分配,程序猿无法指定明确大小

js执行平台虽然存在GC机制,但是由于不同算法的限制,代码书写不同同样会导致内存无法回收,导致内存泄露。

js内存生命周期

  1. 申请内存空间: let obj = {};
  2. 使用内存空间: (读写操作) obj.name = 'sunny';
  3. 释放内存空间: (js中并没有相应的释放api) obj = null;

js中的垃圾回收

js中的内存管理是自动的,每当我们创建函数、对象、数组的时候会自动的分配相应的内存空间;

  • 对象不再被引用的时候是垃圾;
  • 对象不能从根上访问到时也是垃圾;

js可达对象

在一个作用域链上,只要通过根可以有路径查找到的对象都是可达对象。

可以访问到的对象就是可达对象(可以通过引用、作用域链查找到)
可达的标准就是从根出发是否能够被找到
js中的根就可以理解为全局变量对象

js中的引用是如何体现的?

// 引用
let obj1 = {name: 'xm'};
let al1 = obj1;
obj1.age = 26;
obj1 = null;
console.log(al1, obj1); // { name: 'xm', age: 26 } null

GC算法

GC是什么?

垃圾回收机制的简写。可以找到内存中的垃圾,并释放和回收垃圾。

GC中的垃圾是什么?

  • 程序中不再需要使用的对象
  • 程序中不能再访问到的对象

GC算法是什么?

GC是一种机制,垃圾回收器完成具体的工作。

  • 工作的内容就是查找垃圾释放空间、回收空间。
  • 算法就是工作时查找和回收所遵循的规则。

常见的GC算法 引用计数

  • 实现原理

内部通过引用计数器,来维护当前对象的引用数,从而判断该对象的引用数是否为0,来决定它是否是一个垃圾对象。如果引用数值为0,GC就开始工作,将其所在的内存空间进行回收释放和再使用

  • 引用计数器

当某一个对象的引用关系发生改变时,引用计数器就会自动的修改这个对象所对应的引用数值(比如我们代码中有一个对象空间,一个变量引用了它,那么这个对象空间的引用数值加1) 引用数值为0的时候GC就开始工作,将当前的对象空间回收

  • 引用计数的优点

可以即时回收垃圾对象、减少程序卡顿时间。

  1. 发现垃圾立即回收(因为根据当前的引用数值是否为0判断他是否是一个垃圾,如果是垃圾就回收内存空间,释放内存)
  2. 最大限度的减少程序暂停(应用程序在执行的过程中必定会对内存进行消耗,而当前的执行平台内存空间是有上限的,所以内存肯定会有占满的时候。由于引用计数算法时刻监控着那些引用数值为0的对象,当内存爆满的时候会去找那些引用数值为0的对象释放其内存,这个也就保证了当前的内存空间不会有占满的时候)
  • 引用计数的缺点

无法回收循环引用的对象、资源消耗较大

  1. 无法回收循环引用的对象
  2. 时间开销大(当前的引用计数需要去维护一个数值的变化,时刻监控当前引用数值是否修改,修改需要时间)

标记清除

  • 实现原理

核心思想就是将整个垃圾回收操作分为两个阶段:

  1. 遍历所有的对象找到活动对象,进行标记的操作
  2. 遍历所有的对象,找到那些没有标记的对象进行清除。(注意在第二阶段中也会把第一阶段涉及的标志给抹掉,便于GC下次能够正常的工作)

通过两次的遍历行为把我们当前的垃圾空间进行回收,最终交给我们的空闲列表进行维护。

  • 总结

核心思想:分标记和清除两个阶段:

  1. 遍历所有的对象找活动对象做标记
  2. 遍历所有的对象清除没有标记的对象
  3. 回收相应空间
  • 优点

可以回收循环引用的对象空间。相对于引用计数算法来说:解决对象循环引用的不能回收问题。

  • 缺点

容易产生碎片化空间,浪费空间、不能立即回收垃圾对象。

空间碎片化:所谓空间碎片化就是由于当前所回收的垃圾对象,在地址上面是不连续的,由于这种不连续造成了我们在回收之后分散在各个角落,造成后续使用的问题

标记整理

实现原理

和标记清除一样,在V8中也会被频繁使用。

  1. 标记整理可以看做是标记清除的增强;
  2. 标记阶段的操作和标记清除一致;
  3. 清除阶段之前会先执行整理,移动对象位置,使得他们在地址上是一个连续的空间
  • 优点

减少碎片化空间

  • 缺点

不会立即回收垃圾对象

function func() {
    name = '123456';
    return `my name is ${name}!`;
}
func();
console.log(name);

// 对象之间循环引用案例
function fn1() {
    const obj1 = {};
    const obj2 = {};
    obj1.name = obj2;
    obj2.name = obj1;
    return 'lg is a code!';
}
fn1();

代码解释:

调用fn1()后其内部所占用的内存空间会回收释放,比如我们的obj1 和 obj2,因为在全局的地方已经没有引用指向obj1/obj2的情况了,所以引用计数为0,当回收obj1、obj2时,发现obj2的属性指向obj1,obj1的属性指向obj2,有着互相的指引关系,所以引用计数数值不为0,所以这一块空间也释放不了。文章来源地址https://www.toymoban.com/news/detail-408842.html

到了这里,关于JS垃圾回收机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端高频面试题 js中堆和栈的区别和浏览器的垃圾回收机制

    栈(stack) :是栈内存的简称,栈是自动分配相对固定大小的内存空间,并由系统自动释放,栈数据结构遵循FILO(first in last out)先进后出的原则,较为经典的就是乒乓球盒结构,先放进去的乒乓球只能最后取出来。 堆(heap) :是堆内存的简称,堆是动态分配内存,内存大小不固

    2024年02月11日
    浏览(30)
  • [Unity]⭐浅谈Unity内存优化,内存碎片?僵尸内存?以及什么是GC垃圾回收机制。

    目录 🟥 一、什么是内存? 1.物理内存   2.虚拟内存 🟧 二、Unity的内存 1.Unity的内存分类 2.游戏运行时内存占用情况 3.什么是MONO内存? 4.内存碎片、僵尸内存 🟨三、GC 垃圾回收 1.定义 2.一张图清晰得看一下流程~ 3.GC的作用及步骤 4.GC存在的问题及优化策略 🟩 四、内存优

    2024年02月03日
    浏览(38)
  • 浅谈JVM垃圾回收机制

    新生代收集(Minor GC/Young GC):只对新生代进行垃圾收集 老年代收集(Major GC/Old GC):只队老年代进行垃圾收集 混合收集(Mixed GC):对整个新生代和老年代进行垃圾收集 收集整个Java堆和方法区 空间分配担保是为了确保在Minor GC之前老年代还有容纳新生代所有对象的剩余空间 垃圾回收算

    2024年02月10日
    浏览(35)
  • JVM及垃圾回收机制

    类加载器负责将.class文件加载到JVM中。主要分为三种层次:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。它们按层次关系加载类,保证类的隔离性和重用性。 运行时数据区包括方法区、堆、栈、本地方法栈和程序计数器。堆用于存放对象实例,方法区保存类信息和

    2024年02月12日
    浏览(34)
  • 【JVM】垃圾回收机制

     哈喽,哈喽,大家好~ 我是你们的老朋友: 保护小周ღ    今天给大家带来的是  JVM (Java 虚拟机) 的垃圾回收机制,回收是指回收什么?  如何确定要回收的内存: 引用计数,可达性分析,如何释放空间 : 标记清除,复制算法,标记整理,分代回收 ,一起来看看叭~ 本期

    2024年02月09日
    浏览(33)
  • java垃圾回收机制(面试)

    Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆。 Eden 区、两个 Survivor 区 S0 和 S1 都属于新生代,中间一层属于老年代,最下面

    2023年04月26日
    浏览(29)
  • JavaScript垃圾回收机制

    在JavaScript中,垃圾回收(Garbage Collection)是一种自动内存管理机制,它可以自动地识别不再使用的变量和对象并将它们从内存中清除,以释放内存空间。 JavaScript中的垃圾回收器会定期扫描内存中的对象,标记那些可达对象和不可达对象。 可达对象指的是当前代码中正在被使

    2024年02月10日
    浏览(35)
  • java垃圾回收机制

    Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是  堆  内存中对象的分配与回收。Java 堆是垃圾收集器管理的主要区域,因此也被称作  GC 堆。 Eden 区、两个 Survivor 区 S0 和 S1 都属于新生代,中间一层属于老年代,最

    2024年02月04日
    浏览(33)
  • JVM学习 GC垃圾回收机制 (堆内存结构、GC分类、四大垃圾回收算法)

    🤖 作者简介: 努力的clz ,一个努力编程的菜鸟 🐣🐤🐥   👀 文章专栏: 《JVM 学习笔记》 ,本专栏会专门记录博主在学习 JVM 中学习的知识点,以及遇到的问题。   🙉 文章详情: 本篇博客是学习 【狂神说Java】JVM快速入门篇 的学习笔记,关于 GC垃圾回收机制 (堆内存结

    2023年04月19日
    浏览(31)
  • JavaScript中的垃圾回收机制

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包