V8引擎中的垃圾回收机制如何工作?

news2025/3/11 18:57:51

V8引擎中的垃圾回收机制主要通过分代回收和增量标记清除算法来管理内存。以下是其工作原理的详细说明:

V8 的垃圾回收机制基于以下核心设计原则:

1. 分代假设:大多数对象的生命周期很短,只有少数对象会存活较长时间;

2. 减少主线程停顿:通过增量标记、并发标记和惰性清理等技术,尽量减少垃圾回收对 JavaScript 主线程的影响;

3. 高效内存管理:针对不同代的内存区域,采用不同的回收算法,以平衡性能和内存利用率;

V8 的内存堆分为两个主要区域:新生代和老生代。下面分别详细介绍它们的回收机制。

1. 新生代垃圾回收

新生代用于存放生命周期短的对象。V8 对新生代采用 Scavenge 算法,这是一种基于复制的垃圾回收算法。

1.1. Scavenge 算法的工作原理

1. 内存划分

新生代内存被划分为两个等大的半空间:From 空间和To 空间。新对象首先被分配到 From 空间。

2. 对象分配

当 From 空间被填满时,V8 会触发一次新生代垃圾回收。

3. 垃圾回收过程

(1). 标记存活对象:从根对象(如全局对象、当前函数调用栈等)出发,遍历对象图,标记所有存活的对象;

(2). 复制存活对象:将标记的存活对象从 From 空间复制到 To 空间;

(3). 清空 From 空间:复制完成后,清空 From 空间中的所有对象;

(4). 角色交换:From 空间和 To 空间的角色互换,原来的 To 空间变为新的 From 空间;

4. 对象晋升

(1). 如果一个对象在多次新生代垃圾回收后仍然存活,它会被晋升到老生代;

(2). 如果 To 空间已经使用了超过 25%,则本次复制的对象会直接晋升到老生代;

1.2. Scavenge 算法的优点

1. 高效:只复制存活对象,适合生命周期短的对象;

2. 快速:新生代内存较小,回收速度快;

1.3. Scavenge 算法的缺点

1. 内存浪费:始终有一半的内存空间(To 空间)处于闲置状态;

2. 不适合大对象:复制大对象成本较高;

2. 老生代垃圾回收

老生代用于存放生命周期较长的对象,或者从新生代晋升的对象。V8 对老生代采用 标记清除和 标记整理算法。

2.1. 标记清除算法

1. 标记阶段

(1). 从根对象出发,遍历整个对象图,标记所有存活的对象;

(2). 使用三色标记法(白色、灰色、黑色)来跟踪对象的标记状态;

2. 清除阶段

(1). 遍历整个内存区域,清除所有未被标记的对象,即垃圾对象;

(2). 清除后的内存会留下碎片;

2.2. 标记整理算法

1. 标记阶段

(1). 与标记清除算法相同,标记所有存活的对象;

2. 整理阶段

(1). 将所有存活对象向内存的一端移动,使它们占据连续的内存空间;

(2). 清理剩余的内存空间,消除内存碎片;

2.3. 老生代算法的选择

1. 标记清除:速度快,但会产生内存碎片;

2. 标记整理:速度较慢,但可以消除内存碎片,适合内存紧张的场景;

3. V8 会根据内存使用情况和碎片程度动态选择算法;

3. 增量标记

为了减少垃圾回收对主线程的阻塞,V8 引入了增量标记技术。

3.1. 增量标记的工作原理

1. 分阶段标记

(1). 将标记过程分解为多个小步骤,与 JavaScript 主线程交替执行;

(2). 每次只标记一部分对象,避免长时间阻塞主线程;

2. 写屏障

(1). 在增量标记期间,V8 使用写屏障技术来跟踪对象引用的变化;

(2). 当 JavaScript 代码修改对象引用时,写屏障会将被修改的对象标记为“脏对象”,确保标记的准确性;

3.2. 增量标记的优点

1. 减少停顿时间:将长时间的标记过程分散到多个小步骤中,避免主线程长时间阻塞;

2. 提高响应速度:使应用程序更加流畅;

4. 惰性清理

在标记阶段完成后,V8 并不立即执行清除操作,而是采用惰性清理策略。

4.1. 惰性清理的工作原理

1. 延迟清除

(1). 标记完成后,V8 不会立即清除未标记的对象,而是将清除操作推迟到后续的空闲时间或内存不足时执行;

2. 按需清理

(1). 当需要分配新内存时,V8 会优先清理未标记的对象,以腾出可用内存;

4.2. 惰性清理的优点

1. 减少主线程阻塞:将清除操作分散到多个时间点执行,避免一次性清理带来的性能开销;

2. 提高效率:只在需要时执行清理操作,减少不必要的开销;

5. 并发标记和清理

为了进一步减少垃圾回收对主线程的影响,V8 引入了并发标记和清理技术。

5.1. 并发标记

1. 在后台线程中执行标记操作,与 JavaScript 主线程并行运行.

2. 主线程可以继续执行 JavaScript 代码,而不会因为标记操作而阻塞;

5.2. 并发清理

1. 在后台线程中执行清除操作,减少主线程的负担;

5.3. 并发标记和清理的优点

1. 最大化利用多核 CPU:利用多核 CPU 的并行计算能力,提高垃圾回收效率;

2. 减少主线程停顿:使应用程序更加流畅;

6. 其他优化技术

6.1. 并行 Scavenge

1. 在新生代垃圾回收中,V8 使用多线程并行执行复制操作,加快回收速度;

6.2. 空闲时间垃圾回收

1. 在浏览器空闲时,如页面没有用户交互时,V8 会主动执行垃圾回收,减少对用户操作的干扰;

6.3. 内存限制

1. V8 会根据可用内存动态调整垃圾回收的频率和策略,避免内存占用过高;

7. 总结

V8 的垃圾回收机制通过分代回收、增量标记、惰性清理和并发标记清理等技术,实现了高效的内存管理和低延迟的垃圾回收。

其核心思想是:

1. 分而治之:将内存分为新生代和老生代,采用不同的回收策略;

2. 减少停顿:通过增量标记和并发回收,尽量减少对主线程的影响;

3. 动态优化:根据内存使用情况和应用需求,动态调整垃圾回收策略;

这些设计使得 V8 能够在高性能和低延迟之间取得平衡,为现代 JavaScript 应用提供强大的内存管理支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网安全-横向移动PTH 哈希PTT 票据PTK 密匙Kerberos密码喷射

一.域横向pth,mimkatz,NTLM windwos server 2012 R2之前可能是NTLM和LM,之后为NTLM 1.mimkatz ptk 使用mimkatz进行横向移动 mimikatz sekurlsa::pth /user:administrator(目标本地用户名) /domain:192.168.3.32&a…

自然语言处理文本分析:从词袋模型到认知智能的进化之旅

清晨,当智能音箱准确识别出"播放周杰伦最新专辑"的模糊语音指令时;午间,企业舆情系统自动标记出十万条评论中的负面情绪;深夜,科研人员用GPT-4解析百万篇论文发现新材料线索——这些场景背后,是自…

STM32如何精准控制步进电机?

在工业自动化、机器人控制等场合,步进电机以其高精度、开环控制的特性得到了广泛应用。而在嵌入式系统中,使用STM32进行步进电机的精确控制,已成为开发者的首选方案之一。 本文将从嵌入式开发者的角度,深入探讨如何基于STM32 MCU…

[免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版),分享下哈。 项目视频演示 【免费】微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版…

STM32 Bootloader理解

STM32 Bootloader个人理解 stm32单片机启动时会先运行一个引导程序Bootloader,该程序可以判断单片机的启动方式,例如stm32f103单片机会利用 boot0 、boot1 两个引脚判断启动模式。判断完启动模式后,设置 SP地址 以及 PC 指针指向对应的地址。…

Linux SSHD 启动失败:OpenSSL 版本不匹配问题分析与解决

文章目录 Linux SSHD 启动失败:OpenSSL 版本不匹配问题分析与解决问题分析解决方案方法 1:重启 SSH 服务方法 2:检查 sshd 依赖的 OpenSSL 版本方法 3:检查 OpenSSL 共享库方法 4:重新安装 OpenSSH 总结 Linux SSHD 启…

SpringBoot实战(三十五)微服务集成OAuth2.0(UAA)

目录 一、知识回顾1.1 什么是 OAuth2 协议?1.2 OAuth2 的4个角色1.3 OAuth2 的3种令牌1.4 OAuth2 的5种认证方式1.5 OAuth2 内置接口地址 二、UAA介绍2.1 概述2.2 UAA的主要功能2.3 UAA 的应用场景 三、微服务集成3.1 集成示例介绍3.2 集成测试 一、知识回顾 在进行…

DeepSeek进阶应用(一):结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)

🌟前言: 在软件开发、项目管理和系统设计等领域,图表是表达复杂信息的有效工具。随着AI助手如DeepSeek的普及,我们现在可以更轻松地创建各种专业图表。 名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者&…

DeepSeek未来发展趋势:开创智能时代的新风口

DeepSeek未来发展趋势:开创智能时代的新风口 随着人工智能(AI)、深度学习(DL)和大数据的飞速发展,众多创新型技术已经逐渐走向成熟,而DeepSeek作为这一领域的新兴力量,正逐步吸引越…

从0开始的操作系统手搓教程24——完成我们的键盘驱动子系统

目录 所以,我们现来说说转义字符 我们需要如何处理扫描码 当键入的是双字符键时 当键入的是字母键时 下一篇 我们下面来看看我们的键盘驱动子系统是一个怎么个事情。 驱动程序,你可以认为是对硬件的一层封装。我们按照手册规格的规定姿势&#xff0…

git大文件传输报错

简述 git传输大于25M的文件时会报错,需要使用 Git LFS进行文件传输。 Git LFS(Large File Storage)是 GitHub 推荐的方式,可以管理大文件而不会影响 Git 性能。 操作流程 # 安装 Git LFS git lfs install# 将 PDF 文件添加到 G…

基础玩转物联网-4G模块如何快速实现与MQTT服务器通信

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 硬件连接 2.4 检查驱动 3 连接MQTT服务器 3.1 创建MQTT监听Topic 3.2 打开配置工具读取基本信息 3.3 设置连接参数进行数据交互 4 总结 1 前言 MQTT(Message Queuing Telemetry Transport)是一种轻…

使用Beanshell前置处理器对Jmeter的请求body进行加密

这里我们用HmacSHA256来进行加密举例: 步骤: 1.先获取请求参数并对请求参数进行处理(处理成String类型) //处理请求参数的两种方法: //方法一: //获取请求 Arguments args sampler.getArguments(); //转…

mac本地部署Qwq-32b记录

导语 昨天看到阿里开源了Qwq-32b,号称性能可以媲美Deepseek-R1。今天晚上有空就在Mac上折腾了一下,使用ollma进行了部署,效果感觉还不错,特此记录。 环境 硬件 型号:Macbook M1 Pro 14寸内存:512G 环境…

【病毒分析】熊猫烧香病毒分析及其查杀修复

目录 前言 一、样本概况 1.1 样本信息 1.2 测试环境及工具 1.3 分析目标 二、具体行为分析 2.1 主要行为 2.1.1 恶意程序对用户造成的危害 2.2 恶意代码分析 2.2.1 加固后的恶意代码树结构图(是否有加固) 2.2.2 恶意程序的代码分析片段 三、解决方案(或总结) 3.1 …

【语料数据爬虫】Python实现将Json语料数据转换成Word文档

前言 本文是该专栏的第1篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 本专栏为笔者精心推出的“语料数据”爬虫专栏,特别适合需要写作素材的同学,该专栏文章以采集最新的“语料数据”为主,最终篇幅将涵盖【百万级语料数据】库。 值得一提的是,…

警惕AI神话破灭:深度解析大模型缺陷与禁用场景指南

摘要 当前AI大模型虽展现强大能力,但其本质缺陷可能引发系统性风险。本文从认知鸿沟、数据困境、伦理雷区、技术瓶颈四大维度剖析大模型局限性,揭示医疗诊断、法律决策等8类禁用场景,提出可信AI建设框架与用户防护策略。通过理论分析与实操案…

RoboVQA:机器人多模态长范围推理

23 年 11 月来自 Google Deepmind 的论文“RoboVQA: Multimodal Long-Horizon Reasoning for Robotics”。 本文提出一种可扩展、自下而上且本质多样化的数据收集方案,该方案可用于长期和中期的高级推理,与传统的狭窄自上而下的逐步收集相比&#xff0c…

C 语言数据结构(二):顺序表和链表

目录 1. 线性表 2. 顺序表 2.1 概念及结构 2.1.1 静态顺序表(不常用) 2.1.2 动态顺序表(常用) ​编辑 2.2 练习 2.2.1 移除元素 2.2.2 删除有序数组中的重复项 2.2.3 合并两个有序数组 2.3 顺序表存在的问题 3. 链表 …

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战

文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课,而如何在Linux系统上高效地访…