当前位置: 首页 > news >正文

js垃圾回收机制详细讲解

JavaScript 垃圾回收机制(Garbage Collection, GC)负责自动管理内存的分配和释放,确保程序在运行时不会因为内存泄漏而崩溃。它的主要任务是回收不再使用的内存空间,防止内存泄漏。JavaScript 的垃圾回收通常由引擎自动完成,开发者无需手动管理内存,虽然了解其机制有助于编写高效的代码。

1. 垃圾回收的基本概念

垃圾回收的核心思想是找出程序中不再被使用的对象并释放它们占用的内存空间。垃圾回收的对象分为两类:

  • 活动对象(Active objects):当前仍然被程序引用的对象。
  • 垃圾对象(Garbage objects):不再被任何活动对象引用的对象,这些对象占用了内存,但没有办法被访问,因此可以回收。

2. 垃圾回收的算法

JavaScript 的垃圾回收算法有两种主要的类型:引用计数(Reference Counting)标记-清除(Mark-and-Sweep)

2.1 引用计数(Reference Counting)

引用计数算法通过维护一个计数器来跟踪每个对象被引用的次数。当一个对象的引用计数变为零时,说明该对象不再被使用,可以回收其占用的内存。

  • 优点:算法简单,实时性好。
  • 缺点:无法处理循环引用的问题。如果两个对象互相引用且没有其他引用它们,即使它们不再被使用,引用计数也不会变为零,导致内存泄漏。
2.2 标记-清除(Mark-and-Sweep)

标记-清除是现代 JavaScript 引擎使用的垃圾回收算法。该算法分为两个阶段:

  1. 标记阶段:从根对象(如全局对象、当前执行上下文中的局部变量、活动函数等)开始,遍历所有可以到达的对象,标记为“活动”对象。
  2. 清除阶段:遍历堆中的所有对象,清除那些没有被标记为“活动”的对象,回收它们占用的内存。
  • 优点:解决了引用计数无法处理循环引用的问题。
  • 缺点:执行时会暂停 JavaScript 代码的执行,可能导致性能下降。

3. 垃圾回收的根集合(GC Roots)

垃圾回收从“根集合”开始查找所有活动对象。根集合包括:

  • 全局对象(在浏览器中是 window,在 Node.js 中是 global)。
  • 当前函数的活动栈帧(局部变量)。
  • 在全局作用域中引用的变量。
  • DOM 节点和其他全局对象。

所有从根集合可达的对象都被认为是活动对象,它们不能被回收。

4. 垃圾回收的触发机制

垃圾回收并不是随时进行的,它通常由以下几个因素触发:

  • 内存使用量达到阈值:当堆内存中的对象占用超过一定比例时,垃圾回收器会被触发。
  • 手动触发:虽然 JavaScript 的垃圾回收是自动的,但有些 JavaScript 引擎提供了手动触发垃圾回收的方法(例如 V8 引擎的 gc() 函数,需启用开发者模式)。
  • 事件循环:某些垃圾回收机制会在事件循环的空闲时间触发垃圾回收。

5. 垃圾回收的优化策略

虽然垃圾回收机制是自动的,但开发者仍然可以通过一些技巧优化内存管理,减少垃圾回收的负担:

  • 减少全局变量的使用:全局变量通常存活较长时间,不容易被垃圾回收。
  • 避免循环引用:使用 WeakMapWeakSet 来避免不必要的强引用。
  • 手动解除不再使用的对象引用:当对象不再需要时,及时解除引用,例如将对象设置为 null,以便垃圾回收器能够回收它们。
  • 局部变量的作用域控制:尽量将变量控制在尽可能小的作用域内,这样可以更快地释放内存。

6. 内存泄漏和调试

内存泄漏是指程序没有及时释放不再使用的内存,导致程序占用过多的内存空间,最终可能导致性能下降甚至崩溃。常见的内存泄漏情况包括:

  • 未清理的事件监听器:如果绑定了事件监听器,但在不再需要时未解绑,事件处理器会一直保持引用,导致内存无法释放。
  • 闭包引起的内存泄漏:如果闭包中引用了外部变量,而外部变量一直没有被垃圾回收,可能导致内存泄漏。
  • DOM 元素未移除:如果 DOM 元素的引用没有清除,浏览器可能无法回收这些 DOM 元素的内存。

调试内存泄漏可以通过浏览器的开发者工具进行:

  • 使用 Chrome DevTools 的 Memory 面板,进行堆快照分析,找出内存增长异常的原因。

7. 总结

JavaScript 的垃圾回收机制是一个自动的内存管理系统,采用标记-清除算法,旨在自动释放不再使用的内存。通过了解垃圾回收的原理和触发机制,开发者可以编写更高效、内存使用更合理的代码。尽管现代浏览器和 JavaScript 引擎提供了很强的垃圾回收能力,但我们仍然需要关注内存泄漏的问题,尤其是在大规模应用和复杂的前端开发中。

相关文章:

js垃圾回收机制详细讲解

JavaScript 垃圾回收机制(Garbage Collection, GC)负责自动管理内存的分配和释放,确保程序在运行时不会因为内存泄漏而崩溃。它的主要任务是回收不再使用的内存空间,防止内存泄漏。JavaScript 的垃圾回收通常由引擎自动完成&#…...

【Linux/踩坑】Linux中启动eclipse或HDFS因JAVA_HOME设置报错

Linux中启动eclipse或hadoop因JAVA_HOME设置报错 eclipseHadoop eclipse 错误提示: A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. No Java virtual machine was found after searching the follo…...

百度千帆平台构建AI APP的基础概念梳理

百度千帆平台构建AI APP的基础概念梳理 如果想制作大语言模型(LLM)相关的APP, 将利用百度的千帆平台在国内可能是最便捷的途径,因为百度开发了成熟的工作流,前些年还有些不稳定,现在固定下来了&#xff0c…...

Unity3D Huatuo技术原理剖析详解

前言 在游戏开发领域,Unity3D凭借其强大的跨平台能力和丰富的功能,成为了众多开发者的首选工具。而在Unity3D的生态系统中,Huatuo作为一款重要的插件,为游戏开发带来了极大的便利。本文将深入剖析Huatuo的技术原理,并…...

记Fastjson2的一个报ConcurrentModificationException的bug

错误背景:fastjson2的parseObject方法,在spring webflux项目中被调用,有时会报java.util.ConcurrentModificationException错误。报错处的代码如下图: 改了半天与并发安全相关的代码,还是会报此错误。后来改变思路搜…...

使用TimesFM 对车辆销售进行预测

代码功能概述 导入相关包与设置环境变量: 首先导入了如 os、numpy、pandas 等常用的 Python 库,同时设置了一些与特定库(如 XLA_PYTHON_CLIENT_PREALLOCATE 和 JAX_PM AP_USE_TENSORSTORE)相关的环境变量,用于优化计算…...

OpenEuler 22.03 不依赖zookeeper安装 kafka 3.3.2集群

零:规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器,用于搭建 kafka和flink 集群。因为从kafka 2.8 版本以后开始不依赖 zookeeper ,同时考虑到需要找一个发布时间早于 flink 1.17 的kafka 版本且应尽量稳定,综合考虑…...

ubuntu 将python3.8 升级为python3.10并进行版本切换

ubuntu 将python3.8 升级为python3.10并进行版本切换 前言将python3.8 升级为3.10安装pippython版本切换 前言 有一个功能包编译环境需要为python3.10 ,但是当前环境为python3.8 ,所以需要进行版本升级,编译完还需要把环境切换回来。 将pyt…...

3. Kafka入门—安装与基本命令

Kafka基础操作 一. 章节简介二. kafka简介三. Kafka安装1. 准备工作2. Zookeeper安装2.1 配置文件2.2 启动相关命令3. Kafka安装3.1 配置文件3.2 启动相关命令-------------------------------------------------------------------------------------------------------------…...

如何使用 python创建图片格式转换器

在本篇博客中,我们将通过一个简单的实例来展示如何使用 wxPython 创建一个图形用户界面(GUI)应用程序,用于将图片从一种格式转换为另一种格式。我们将通过以下几个步骤实现这一目标: C:\pythoncode\new\imageconvertty…...

命令行之巅:Linux Shell编程的至高艺术(上)

文章一览 前言一、shell概述1.1 shell的特点和类型1.1.1 **shell的特点:**1.1.2 常用shell类型 1.2 shell脚本的建立和执行1.2.1 建立shell脚本1.2.2 执行shell脚本的方式1.2.3 shell程序实例 二、shell变量与算数运算2.1 简单shell变量2.1.1 简单变量定义和赋值2.1…...

【gulp】gulp 的基本使用

gulp 是一个基于node的自动化打包构建工具,前端开发者可以使用它来处理常见任务: 创建项目 进入项目 npm init -ynpm i gulp -g (使用命令 gulp)npm i gulp -D # 开发依赖(前端工具都是开发依赖 本地安装 代…...

Linux 下处理 ^M 字符的最佳实践

Linux 下处理 ^M 字符的最佳实践 一、快速解决方案 按照优先级排序的三种解决方案: 1. 使用 dos2unix(推荐) # 安装 sudo apt-get install dos2unix # Ubuntu/Debian sudo yum install dos2unix # CentOS# 使用 dos2unix 文件名2. 使用 sed sed...

【优选算法】—复写零(双指针算法)

云边有个稻草人-CSDN博客 每天至少一道算法题,接着干,以额现在的实力想完成那个目标确实难。算法题确实烧脑,挺煎熬的,但脑子烧多了是不是就该好些了?。。。 记得那句话,必须有为成功付出代价的决心&#x…...

2024国赛A问题三和四

问题三 最小螺距单目标优化模型的建立 问题二考虑了在螺距固定的条件下计算舞龙队盘入的终止时间,问题三在第二问的基础提出了改变螺距的要求,即求解在螺距最小为多少时,龙头前把手能够沿着相应的螺线盘入到调头空间的边界。故可将其转换为…...

asp.net 高校学生勤工俭学系统设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…...

《计算机组成及汇编语言原理》阅读笔记:p116-p120

《计算机组成及汇编语言原理》学习第 7 天,p116-p120 总结,总计 5 页。 一、技术总结 1.CPU优化 (1)increase overall performance number 例如:16位电脑提升到32位电脑。 (2)multiprocessing One way to make computers more useful i…...

C# OpenCvSharp DNN 卡证检测矫正

目录 说明 效果 模型 项目 代码 下载 参考 说明 源码地址:https://modelscope.cn/models/iic/cv_resnet_carddetection_scrfd34gkps 在实人认证、文档电子化等场景中需要自动化提取卡证的信息,以便进一步做录入处理。这类场景通常存在两类问题&…...

Spring Boot 中 Map 的最佳实践

在Spring Boot中使用Map时,请遵循以下最佳实践: 1.避免在Controller中 直接使用Map。应该使用RequestBody 接收-个DTO对象或者 RequestParam接收参数,然后在Service中处 理Map。 2.避免在Service中 直接使用原始的Map。应该使用Autowired 注入-个专门…...

J-LangChain - 智能链构建

介绍 j-langchain是一个Java版的LangChain开发框架&#xff0c;旨在简化和加速各类大模型应用在Java平台的落地开发。它提供了一组实用的工具和类&#xff0c;使得开发人员能够更轻松地构建类似于LangChain的Java应用程序。 依赖 Maven <dependency><groupId>i…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...