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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】GPT-4 vs DeepSeek-R1:谁主导了2025年的AI技术竞争?

前言 2025年,人工智能技术将迎来更加激烈的竞争。随着OpenAI的GPT-4和中国初创公司DeepSeek的DeepSeek-R1在全球范围内崭露头角,AI技术的竞争格局开始发生变化。这篇文章将详细对比这两款AI模型,从技术背景、应用领域、性能、成本效益等多个方…

C/C++蓝桥杯算法真题打卡(Day1)

一、LCR 018. 验证回文串 - 力扣(LeetCode) 算法代码: class Solution { public:bool isPalindrome(string s) {int n s.size();// 处理一下s为空字符的情况if (n 0) {return true; // 修正拼写错误}// 定义左右指针遍历字符串int left …

SpringUI高保真动态交互元件库:助力产品原型设计

SpringUI 是一个专为Web设计与开发领域打造的高质量、全面且易于使用的交互元件集合。通过提供一系列预制的、高质量的交互组件,帮助设计师快速构建出功能丰富、界面美观的原型。 ————基础元件: ——————按钮 Button:基础按钮、禁用…

vue+neo4j 四大名著知识图谱问答系统

编号: D039 视频 vueneo4j四大名著知识图谱问答系统 技术架构 vuedjangoneo4jmysql技术实现 功能模块图 问答:基于知识图谱检索、支持图多跳、显示推理路径 姜维的师傅的主公的臣是谁: 马谡 知识图谱:四大名著总共4个图谱 红楼梦图谱 …

学习使用ESP8266进行MQTT通信并在网页上可视化显示

目录 一、工具 二、 流程 三、代码实现 设置MQTT服务器地址 设置服务器和端口号 连接MQTT服务器并订阅话题 回调处理函数 发布数据到话题 四、调试软件使用 打开MQTTx 添加话题 五、网页使用 一、工具 arduino ide esp8266/32单片机 lot物联网网页 MQTTx软件或者m…

大模型应用开发学习笔记

Huggingface 下载模型: model_dirr"G:\python_ws_g\code\LLMProject\session_4\day02_huggingface\transformers_test\model\uer\uer\gpt2-chinese-cluecorpussmall\models--uer--gpt2-chinese-cluecorpussmall\snapshots\c2c0249d8a2731f269414cc3b22dff021…

虚拟卡 WildCard (野卡) 保姆级开卡教程

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 本篇教程为 WildCard 的介绍以及开卡教学,要了解不同平台(Grok、Talkatone 等)的订阅方式请移步《订阅教程》分类 当我们想要充值国外平台会员时,一般都需要使…

C++实现3D(EasyX)详细教程

一、关于3D 我们看见,这两个三角形是相似的,因此计算很简单 若相对物体的方向是斜的,计算三角函数即可 不会的看代码 二、EasyX简介 initgraph(长,宽) 打开绘图 或initgraph(长,宽…

Qt 进度条与多线程应用、基于 Qt 的文件复制工具开发

练习1:Qt 进度条与多线程应用 题目描述 开发一个基于 Qt 的应用程序,该应用程序包含一个水平进度条(QSlider),并且需要通过多线程来更新进度条的值。请根据以下要求完成代码: 界面设计: 使用 QS…

【算法day2】无重复字符的最长子串 两数之和

无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 https://leetcode.cn/problems/longest-substring-without-repeating-characters/ class Solution { public:int lengthOfLongestSubstring(string s) {int sub_length …

XHR请求解密:抓取动态生成数据的方法

在如今动态页面大行其道的时代,传统的静态页面爬虫已无法满足数据采集需求。尤其是在目标网站通过XHR(XMLHttpRequest)动态加载数据的情况下,如何精准解密XHR请求、捕获动态生成的数据成为关键技术难题。本文将深入剖析XHR请求解密…

【漫话机器学习系列】121.偏导数(Partial Derivative)

偏导数(Partial Derivative)详解 1. 引言 在数学分析、机器学习、物理学和工程学中,我们经常会遇到多个变量的函数。这些函数的输出不仅取决于一个变量,而是由多个变量共同决定的。那么,当其中某一个变量发生变化时&…

[C语言日寄] 字符串操作函数的使用及其拓展

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

ssm_mysql_暖心家装平台

收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…

地下井室可燃气体监测装置:守护地下安全,防患于未“燃”!

在城市的地下,隐藏着无数的燃气管道和井室,它们是城市基础设施建设的重要部分,燃气的使用,给大家的生活提供了极大的便利。在便利生活的背后,也存在潜在的城市安全隐患。 近年来,地下井室可燃气体泄漏事故…

EasyCVR平台赋能农业产业园:AIoT驱动的视频监控与大数据分析解决方案

随着现代农业的快速发展,农业产业园区的规模不断扩大,管理复杂度也随之增加。为了提高农业生产效率、保障农产品质量安全、实现精细化管理和智能化运营,视频信息化建设成为现代农业产业园的重要发展方向。EasyCVR作为一款功能强大的视频监控与…

【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成

标题:《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目:https://zju3dv.github.io/StarGen 来源:商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…

STM32 进阶 定时器

在stm32中定时器大概分为4类 1、系统定时器:属于arm内核,内嵌在NVIC中 2、高级定时器:可以用来刹车和死区 3、通用定时器:可以用来输出pwm方波 4、基本定时器:只能记数 系统定时器注意: 1、系统定时器…

day21-API(算法,lambda,练习)

常见的七种查找算法: ​ 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉有疑惑,可以先看一下哥们后面录制的数据结构…