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

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

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 应用提供强大的内存管理支持。

相关文章:

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

V8引擎中的垃圾回收机制主要通过分代回收和增量标记清除算法来管理内存。以下是其工作原理的详细说明: V8 的垃圾回收机制基于以下核心设计原则: 1. 分代假设:大多数对象的生命周期很短,只有少数对象会存活较长时间;…...

内网安全-横向移动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解析百万篇论文发现新材料线索——这些场景背后,是自…...

洛谷 P2234:[HNOI2002] 营业额统计 ← STL set

【题目来源】 https://www.luogu.com.cn/problem/P2234 【题目描述】 Tiger 最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger 拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析…...

linux---天气爬虫

代码概述 这段代码实现了一个天气查询系统,支持实时天气、未来天气和历史天气查询。用户可以通过终端菜单选择查询类型,并输入城市名称来获取相应的天气信息。程序通过 TCP 连接发送 HTTP 请求,并解析返回的 JSON 数据来展示天气信息。 #in…...

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

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

C语言:确定进制

题目&#xff1a; 6942对于十进制来说是错误的&#xff0c;但是对于13进制来说是正确的。即, 6(13) 9(13) 42(13)&#xff0c; 而 42(13)4131213054(10)。 任务是写一段程序&#xff0c;读入三个整数p、q和 r&#xff0c;然后确定一个进制 B(2<B<40) 使得 p q r。 如果…...

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

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

STM32 Bootloader理解

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

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

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

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

目录 一、知识回顾1.1 什么是 OAuth2 协议&#xff1f;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 集成测试 一、知识回顾 在进行…...

K8s 1.27.1 实战系列(七)Deployment

一、Deployment介绍 Deployment负责创建和更新应用程序的实例,使Pod拥有多副本,自愈,扩缩容等能力。创建Deployment后,Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会将该实例替换为群集中另一个节点上的…...

Spring Boot笔记(上)

01 概要 Spring Boot 是 Java 领域最流行的 快速开发框架&#xff0c;专为简化 Spring 应用的初始搭建和开发而设计。 一、Spring Boot 解决了什么问题&#xff1f; 传统 Spring 痛点 • 繁琐的 XML 配置 • 需要手动管理依赖版本 • 部署依赖外部 Web 服务器&#xff08;如 …...

Mysql主从复制和Mysql高可用以及负载均衡配置

需要先配置MySQL主从复制&#xff0c;然后再在主MySQL服务器上配置MySQL Router。以下是详细说明和步骤&#xff1a; 1. 为什么需要先配置MySQL主从复制&#xff1f; MySQL主从复制是MySQL高可用性和负载均衡的基础&#xff0c;通过将数据从主服务器实时同步到从服务器&#…...

MySQL------存储引擎和用户和授权

9.存储引擎 1.两种引擎 MyISAM和InnoDB 2.两种区别 1.事务&#xff1a; MyISAM不支持事务 2.存储文件: innodb : frm、ibd MyISAM: frm、MYD、MYI 3.数据行锁定: MyISAM不支持 4.全文索引: INNODB不支持&#xff0c;所以MYISAM做select操作速度很快 5.外键约束: MyISAM…...

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

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

大白话react第十八章React 与 WebGL 项目的高级拓展与优化

大白话react第十八章React 与 WebGL 项目的高级拓展与优化 1. 实现 3D 模型的导入与动画 在之前的基础上&#xff0c;我们可以导入更复杂的 3D 模型&#xff0c;并且让这些模型动起来&#xff0c;就像在游戏里看到的角色和场景一样。这里我们使用 GLTF 格式的模型&#xff0c…...

【WPF】Slider滑动方法(INotifyPropertyChanged、ValueChanged )响应速度对比分析

一、Slider基础用法 在 XAML 中添加一个 Slider 控件&#xff0c;并设置其基本属性&#xff1a; <Slider Minimum"0" <!-- 最小值 -->Maximum"100" <!-- 最大值 -->Value"50" <!-- 初始值 -->Width&quo…...

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

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

1-003:MySQL 的索引类型有哪些?

MySQL 中的索引类型主要分为以下几类&#xff0c;每种索引都有不同的适用场景和优化查询的作用&#xff1a; 1. 按存储结构分类 ① 聚簇索引&#xff08;Clustered Index&#xff09; 特点&#xff1a; InnoDB 引擎的 主键索引 就是 聚簇索引。数据与索引存储在一起&#xff…...

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

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

git大文件传输报错

简述 git传输大于25M的文件时会报错&#xff0c;需要使用 Git LFS进行文件传输。 Git LFS&#xff08;Large File Storage&#xff09;是 GitHub 推荐的方式&#xff0c;可以管理大文件而不会影响 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&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻…...

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

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

Python入门3:类与面对对象

目录 类 一、类的概念 二、类的定义和使用 2.1 类的定义 2.2 实例化对象 三、类的属性和方法 3.1 属性 属性的类型&#xff1a; 补充--私有属性 属性的操作&#xff1a; 3.2 方法 方法的类型&#xff1a; 补充--私有方法 方法的操作 四、面对过程和面对对象 …...

mac本地部署Qwq-32b记录

导语 昨天看到阿里开源了Qwq-32b&#xff0c;号称性能可以媲美Deepseek-R1。今天晚上有空就在Mac上折腾了一下&#xff0c;使用ollma进行了部署&#xff0c;效果感觉还不错&#xff0c;特此记录。 环境 硬件 型号&#xff1a;Macbook M1 Pro 14寸内存&#xff1a;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大模型虽展现强大能力&#xff0c;但其本质缺陷可能引发系统性风险。本文从认知鸿沟、数据困境、伦理雷区、技术瓶颈四大维度剖析大模型局限性&#xff0c;揭示医疗诊断、法律决策等8类禁用场景&#xff0c;提出可信AI建设框架与用户防护策略。通过理论分析与实操案…...

做到哪一步才算精通SQL

做到哪一步才算精通SQL-Structured Query Language 数据定义语言 DDL for StructCREATE&#xff1a;用来创建数据库、表、索引等对象ALTER&#xff1a;用来修改已存在的数据库对象DROP&#xff1a;用来删除整个数据库或者数据库中的表TRUNCATE&#xff1a;用来删除表中所有的行…...