JavaScript垃圾回收机制

news/2024/11/8 14:18:07/

一、什么是JavaScript垃圾回收机制

  • 在JavaScript中,垃圾回收(Garbage Collection)是一种自动内存管理机制,它可以自动地识别不再使用的变量和对象并将它们从内存中清除,以释放内存空间。

  • JavaScript中的垃圾回收器会定期扫描内存中的对象,标记那些可达对象和不可达对象。

    1. 可达对象指的是当前代码中正在被使用的对象
    2. 不可达对象指的是已经不再被引用的对象。
  • 垃圾回收器会将不可达对象标记为垃圾对象,并将它们从内存中清除。

  • JavaScript中的垃圾回收机制主要有两种:

    1. 标记清除(Mark-and-Sweep)和引用计数(Reference Counting)。
    2. 标记清除是JavaScript中主流的垃圾回收算法,而引用计数则已经很少被使用。

二、标记清除

  • 标记清除(Mark-and-Sweep)的工作原理是:垃圾回收器会定期扫描内存中的对象,从根对象开始遍历内存中的所有对象,对于可达对象,通过标记它们来标识它们是可达对象;对于未被标记的对象,就说明它们是不可达对象,需要被清除。该算法的优点是可以处理循环引用的情况,但在执行时间上可能会比较长,影响程序的性能。

例如,有一个对象A,其中包含一个指向对象B的引用,而对象B也包含一个指向对象A的引用。此时,如果我们不手动清除这两个对象,垃圾回收器就会通过标记清除算法自动识别这两个对象并清除它们。

  • 实现标记清除(Mark-and-Sweep)算法的主要步骤如下:

    1. 创建一个根对象,例如window对象;
    2. 遍历根对象及其所有引用的对象,并标记它们是可达对象;
    3. 遍历内存中所有对象,如果发现某个对象未被标记,就将其清除。
    4. 在JavaScript中,标记清除算法是由浏览器自动完成的,开发者无需手动实现。

三、引用计数

  • 引用计数(Reference Counting)的工作原理是:垃圾回收器会记录每个对象被引用的次数,当对象被引用的次数为0时,就将该对象清除。该算法的优点是实现较为简单,但无法处理循环引用的情况,可能会导致内存泄漏。

例如,有一个对象A,其中包含一个指向对象B的引用,而对象B也包含一个指向对象A的引用。此时,由于对象A和B互相引用的次数不为0,垃圾回收器就无法清除这两个对象,导致内存泄漏。

  • 实现引用计数(Reference Counting)算法的主要步骤如下:
    1. 给每个对象添加一个引用计数器,初始值为0;
    2. 当对象被引用时,引用计数器加1;
    3. 当对象不再被引用时,引用计数器减1;
    4. 当引用计数器为0时,就将该对象清除。
    5. 在JavaScript中,引用计数算法也是由浏览器自动完成的,开发者无需手动实现。不过需要注意的是,由于引用计数无法处理循环引用的情况,因此现代浏览器一般采用标记清除算法。

四、关于标记清除算法如何处理循环引用的情况

  • 标记清除算法处理循环引用的情况是通过标记和清除两个阶段来完成的。
    • 在标记阶段,垃圾回收器会从根对象开始遍历内存中的所有对象,标记所有可达对象,而对于不可达的对象,则不进行标记。
    • 在清除阶段,垃圾回收器会清除所有未被标记的对象,从而释放它们占用的内存空间。
  • 在处理循环引用的情况时,标记清除算法会通过特殊的标记方式来标记循环引用的对象。
  • 具体来说,在标记阶段,垃圾回收器会将循环引用的对象标记为“可达”,并且在遍历过程中不会重复标记已经被标记过的对象。
  • 在清除阶段,由于循环引用的对象被标记为“可达”,因此不会被清除,从而保证了循环引用的正确处理。

例如,有一个对象A,其中包含一个指向对象B的引用,而对象B也包含一个指向对象A的引用。在标记阶段,垃圾回收器会从根对象开始遍历内存中的所有对象,标记对象A和B为可达对象,并且标记它们是循环引用的对象。在清除阶段,由于对象A和B被标记为可达对象,因此不会被清除,从而保证了循环引用的正确处理。



http://www.ppmy.cn/news/76700.html

相关文章

如何实现弹性布局:弹性伸缩布局的原理和实践

在当今的数字时代,网页设计已成为一个重要的领域。为了满足各种设备和屏幕尺寸的需求,弹性布局(也称为弹性伸缩布局)已成为一种流行的网页布局方式。这种布局方式可以自适应不同的屏幕大小,提供更好的用户体验&#xf…

网终安全技术(刘化君)课后被略的答案

目录 8.HTTP客户机与Wb服务器通信通常会泄露哪些信息? 9.在TCP连接建立的3次握手阶段,攻击者为什么可以成功实施SYN Flood攻击?在实际中,如何防范此类攻击? 常用的网络漏洞扫描技术有哪几种?试举例说明。…

第三章 基本数据类型

文章目录 第三章 基本数据类型3.1 数字类型3.1.1 整数类型3.1.2 浮点数类型3.1.3 复数类型 3.2 数字类型的运算3.2.1 数值运算操作符3.2.2 数值运算函数 3.3 字符串类型及格式化3.3.1 字符串的索引3.3.2 字符串的切片3.3.3 format()方法的基本使用3.3.4 format()方法的格式控制…

linux命令行如何查看命令帮助信息

一,简介 “授之以鱼不如授之以渔”,我们再学习linux命令的时候,想查看某个命令的详细说明,有哪些方法呢?本文来介绍一下如何在命令行查找命令的帮助信息。 二,linux命令格式介绍 Linux命令一般由三部分组…

玩转SpringCloud Alibaba,看阿里大佬的笔记是真香

大家都知道,SpringCloudAlibaba 风靡 Java 开发行业,各个公司都在用这套技术,所以咱们 Java 工程师不管是日常工作或是出去面试,都会用到或者被问到关于SpringCloudAlibaba的应用以及底层原理 所以说,小编下面带来一份…

Compose For Desktop 实践:使用 Compose-jb 做一个时间水印助手

前言 在我之前的文章 在安卓中实现读取Exif获取照片拍摄日期后以水印文字形式添加到照片上 中,我们已经实现了在安卓端读取 Exif 信息后添加文字水印到图片上。 也正如我在这篇文章中所说的,其实这个需求使用手机来实现是非常不合理的,一般…

截图自动添加水印(macOS/windows)

文章目录 1. 截图自动加水印1.1. windows1.2. macOS 2. 对已有图像批量加水印2.1 windows2.2 macOS 1. 截图自动加水印 1.1. windows 直接看这篇文章,一键截图自动生成水印/自动签名主要就是使用一个叫 SPX 的软件 1.2. macOS 其实apple的操作系统,i…

JavaWeb14 - 异步请求 - 02 - Ajax

1. 概述 1.1 官方文档 Ajax 在线文档:https://www.w3school.com.cn/js/js_ajax_intro.asp 1.2 Ajax 基本介绍 1.2.1 Ajax 是什么 AJAX 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML)Ajax 是一种浏览器异步发起请求(指定发哪些数据)&…