介绍一下js垃圾回收机制

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

JavaScript中的垃圾回收机制负责自动管理内存,回收不再使用的对象所占用的内存空间。在JavaScript中,开发者不需要显式地分配和释放内存,垃圾回收器会自动完成这些操作。以下是关于JavaScript垃圾回收机制的一些关键概念:

  1. 内存生命周期:JavaScript内存生命周期包括分配、使用和释放三个阶段。首先,内存会被分配给变量或对象;然后,程序会使用这些变量或对象;最后,不再需要的变量或对象会被垃圾回收器释放。
  2. 可达性:垃圾回收器通过可达性来判断一个对象是否还在使用。根对象(如全局对象和其他内置对象)被认为是可达的。如果一个对象可以通过根对象或其他可达对象引用链到达,那么它也被认为是可达的。
  3. 引用计数:这是一种较早的垃圾回收策略,通过追踪每个对象的引用次数来判断对象是否仍在使用。当对象的引用计数为0时,表示对象不再被使用,可以被回收。然而,引用计数算法存在循环引用问题,无法回收循环引用的对象。
  4. 标记-清除:这是现代JavaScript引擎中常见的垃圾回收算法。标记-清除算法首先会标记所有可达对象,然后遍历整个内存空间,清除未被标记的对象。这种算法可以处理循环引用问题,但可能会导致内存碎片。
  5. 分代回收:由于不同对象的生命周期长短不同,现代JavaScript引擎将内存分为新生代和老生代。新生代主要存放短生命周期的对象,老生代主要存放长生命周期的对象。新生代和老生代的垃圾回收策略会有所不同。
  6. 增量回收和懒惰回收:为了降低垃圾回收对程序执行的影响,现代JavaScript引擎采用了增量回收和懒惰回收策略。增量回收将回收工作分成多个小任务,穿插在程序执行过程中;懒惰回收则会在一定程度上推迟回收操作,以减少性能开销。

 

以下是一个简单的示例,演示了 JavaScript 垃圾回收机制中的引用计数和标记清除:

// 引用计数示例
let a = { name: 'John' };
let b = a; // b 引用了 a,a 的引用计数变为 2
a = null; // a 不再引用这个对象,a 的引用计数变为 1
b = null; // b 不再引用这个对象,这个对象的引用计数变为 0,可以被垃圾回收器回收

// 标记清除示例
function foo() {
  let x = { name: 'Alice' };
  let y = { name: 'Bob' };
  x.friend = y;
  y.friend = x;
}

foo(); // 函数执行完后,x 和 y 都不再被使用,但它们之间相互引用,无法使用引用计数来回收内存
// 垃圾回收器定期运行,会发现 x 和 y 都已经不再被引用,可以被回收

在这个示例中,当变量 a 被赋值给变量 b 时,对象的引用计数变为 2。当 a 被赋值为 null 时,对象的引用计数变为 1。最后当 b 也被赋值为 null 时,对象的引用计数变为 0,可以被垃圾回收器回收。

另外,函数 foo 中创建了两个对象 xy,并且它们相互引用。在函数执行完后,这两个对象不再被使用,但它们之间的引用关系无法使用引用计数来回收内存。因此,垃圾回收器会定期运行,查找那些已经不再被引用的对象,然后释放它们所占用的内存空间。


再来一个例子,我们将创建一些对象并解释JavaScript的垃圾回收机制。

// 创建对象
function createPerson(name, age) {
    return {
        name: name,
        age: age,
    };
}

// 创建两个对象
let person1 = createPerson("Alice", 30);
let person2 = createPerson("Bob", 35);

// person1 和 person2 变量引用了两个新创建的对象,这些对象在内存中是可达的

// 现在将 person1 引用另一个对象
person1 = createPerson("Charlie", 28);

// 之前 person1 引用的 "Alice" 对象现在已经不再可达,因为没有变量引用它
// JavaScript的垃圾回收器会识别到这一点,并在合适的时机释放其内存

// 创建一个循环引用
let objA = {
    name: "ObjA",
};
let objB = {
    name: "ObjB",
};
objA.link = objB;
objB.link = objA;

// 将变量设置为 null,打破可达性
objA = null;
objB = null;

// 现在 objA 和 objB 对象都不再可达,即使它们彼此引用
// 使用标记-清除算法的垃圾回收器会识别到这一点,并释放它们占用的内存

在这个例子中,我们创建了几个对象并对它们进行了引用。当一个对象不再可达时,它就成为了垃圾回收的目标。对于循环引用的情况,标记-清除算法可以识别到并正确处理这种情况,释放不再使用的对象所占用的内存。

 

注意:不同的JavaScript引擎可能采用不同的垃圾回收策略,如V8SpiderMonkeyJavaScriptCore等。文章来源地址https://www.toymoban.com/news/detail-410480.html

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

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

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

相关文章

  • JVM G1垃圾回收机制介绍

    G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而其

    2024年02月13日
    浏览(24)
  • JVM中的垃圾回收机制

    java相较于c、c++语言的优势之一是自带垃圾回收器,垃圾回收是指 不定时 去堆内存中清理 不可达 对象。不可达的对象并不会 马上 就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,程序员唯一能做的就是通过调用System.gc 方法来建议执行垃圾收集

    2024年02月16日
    浏览(40)
  • 面试题:JS如何最快的执行垃圾回收机制

    因为没看见答案,所以也不知道对不对。   JavaScript 的垃圾回收机制是由 JavaScript 引擎自动管理的,通常情况下我们无法控制垃圾回收机制的执行时间和频率。 然而,我们可以采取一些优化策略来减少垃圾回收的性能开销,从而提高代码执行速度。 减少全局变量 :全局变量

    2023年04月13日
    浏览(37)
  • 关于js的内存管理和垃圾回收机制的理解

    js的内存管理: 内存管理,顾名思义,js在创建变量时,会在内存中分配空间,来储存新增的变量,其中有两种方式, 1:基本类型,系统会在内存中分配实实在在的内存空间,来存放新增的变量,存储的数据结构为栈 2:引用类型,函数,对象等,系统也会在内存中分配空间

    2024年02月11日
    浏览(33)
  • HDFS中的Trash垃圾桶回收机制

    回收站(垃圾桶)是windows操作系统里的一个系统文件夹,主要用来存放用户历史删除的文档文件资料,存放在回收站的文件可以恢复 回收站的功能给了我们一剂“后悔药”。回收站保存了删除的文件,文件夹,图片等。这些项目将一直保留在回收站中,直到清空回收站 HDF

    2024年02月13日
    浏览(34)
  • 前端高频面试题 js中堆和栈的区别和浏览器的垃圾回收机制

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

    2024年02月11日
    浏览(30)
  • PHP快速实战20-PHP7中的垃圾回收机制与原理讲解

    本文已收录于PHP全栈系列专栏:PHP快速入门与实战 在计算机程序中,垃圾回收指的是一种自动管理内存的技术。在程序执行过程中,分配给它的内存会随着对象的创建和销毁不断发生变化,如果没有垃圾回收,这些不再被使用的内存会一直占用系统资源,最终导致系统崩溃。

    2024年02月08日
    浏览(38)
  • 说一下 JVM 有哪些垃圾回收算法?

    标记无用对象,然后进行清除回收。 标记-清除算法(Mark-Sweep)是一种常见的基础垃圾收集算法,它将垃圾收集分为两个阶段: 标记阶段:标记出可以回收的对象。 清除阶段:回收被标记的对象所占用的空间。 标记-清除算法之所以是基础的,是因为后面讲到的垃圾收集算法

    2024年02月22日
    浏览(32)
  • 说一下 JVM 有哪些垃圾回收器?

    如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。下图展示了7种作用于不同分代的收集器,其中用于回收新生代的收集器包括Serial、ParNew、Parallel Scavenge,回收老年代的收集器包括SerialOld、Parallel Old、CMS,还有用于回收整个Java堆的G1收集器

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

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

    2024年02月04日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包