V8 引擎中的垃圾收集器

news2024/12/22 10:25:49

V8 引擎中的垃圾收集器

垃圾收集是跟踪活动对象的过程,同时销毁堆内存中未引用的对象,为将来创建的新对象腾出空间。本文将讨论V8 引擎的垃圾收集器,V8 引擎是由 GoogleC++ 编写开发的开源、高性能 JavaScriptWebAssembly 引擎。

V8 引擎用于各种应用程序,例如 Chrome 和 Node.js。

V8 垃圾收集器有一些必须定期执行的基本任务:

  1. 识别活动对象(被引用)。
  2. 回收/重用死对象(未被引用)占用的内存。
  3. 压缩/碎片内存。(取决于GC的场景)

V8 堆分为两个主要组:年轻代,进一步分为幼儿代和中间子代,以及老一代。当对象第一次创建时,它们被放置在幼儿代中。如果它们在下一次垃圾回收中幸存下来,它们就会被移动到年轻代的中间子代。如果它们在另一次垃圾回收中幸存下来,它们就会被移入老一代。

在这里插入图片描述
每一代都有不同的算法来清理垃圾。

  • 年轻代 —— Minor GC
  • 老年代 —— Major GC

在解释这两种算法如何工作之前,有一个非常重要的假设需要写出来。

世代假设:婴儿死亡率或世代假设是这样的观察:在大多数情况下,年轻的物体比旧的物体更有可能死亡。

这基本上表明大多数物体都会在年轻时死亡。从垃圾收集的角度来看,大多数对象被分配后几乎立即变得不可访问。对于大多数动态语言来说都是如此。

主要垃圾收集器 - Major GC

Major GC 从整个堆中收集垃圾。

标记(Marking)

标记过程涉及识别可到达的对象。垃圾收集器从一组已知的对象指针(称为根)开始,其中包括执行堆栈和全局对象。然后,它跟随每个指针指向下一个可到达的对象,并将其标记为这样。此过程递归地继续,直到找到并标记运行时中的每个可到达的对象。

清理(Sweeping)

清理是通过将死对象添加到称为“空闲列表”的数据结构来识别和填充死对象留下的内存间隙的过程。一旦垃圾收集器完成标记不可访问的对象,它就会找到连续的间隙并将它们添加到“空闲列表”中以便于访问。当我们需要分配内存时,我们可以快速检查Free List数据结构来找到合适的可用内存块。

压缩(Compaction)

在某些情况下,垃圾收集器使用碎片启发式来决定要压缩哪些页面。然后,使用该页面的“空闲列表”将幸存的对象复制到未压缩的页面中。通过这样做,我们能够重用死亡对象留下的小而分散的内存间隙。

在这里插入图片描述

小型垃圾收集器 - Minor GC

Minor GC 使用Scavenger算法收集年轻代中的垃圾。

正如“年轻一代和老一代结构”的图像所示,有幼儿代和中间子代区域。我们将这两个区域分为From-Space(幼儿代)和To-Space(中间子代)。

在分配对象期间,它们被放置在From-Space中,当Scavenger算法启动时,对象被移动到To-Space。在最坏的情况下,每个对象都可以在清理阶段幸存下来,这需要复制每个对象,这意味着总空间的一半始终是空的。

为了进行清理,我们有一组额外的根,它们是从旧到新的参考。这些是旧空间中的指针,指向年轻代中的对象。这些与堆栈和全局变量相结合,而不是跟踪每次清理的整个堆图,这就是我们如何知道年轻代的每个引用,而不必跟踪整个老年代。

在这里插入图片描述
scavenger 步骤将所有幸存的对象移动到连续的内存块(死对象留下的间隙被活对象和内存字节覆盖)。然后我们切换两个空间,即从From-SpaceTo-Space,反之亦然。一旦垃圾收集完成,新的分配就会发生在起始空间中的下一个空闲地址。

仅凭这一策略,我们很快就会耗尽年轻一代的空间。在第二次垃圾回收中幸存下来的对象将被移至老一代而不是 To-Space 中。然后,我们更新引用已移动的原始对象的指针。每个复制的对象都会留下一个转发地址,用于更新原始指针以指向新位置。

在这里插入图片描述
在清理过程中,发生了三件事。标记、移动和指针更新。全部一起。

从操作系统的角度来看算法如何工作

scavenger(Minor GC)

在年轻代垃圾收集过程中,V8 使用并行清理在多个辅助线程之间分配工作。每个线程都被分配了一定数量的指针来跟踪并急切地将它遇到的任何活动对象疏散到To-Space中。但是,在尝试清空对象时,清理任务必须通过原子读/写/比较和交换操作相互协调。

在这里插入图片描述

Full Mark Compact (Major GC)

在老年代垃圾收集过程中,V8从并发标记开始。当堆接近动态计算的限制时,将启动并发标记任务。每个助手都被分配了许多要跟踪的指针,它们在跟踪发现的对象的所有引用时标记遇到的每个对象。当 JavaScript 在主线程上执行时,并发标记在后台进行。

一旦并发标记完成或达到动态分配限制,主线程就会执行快速标记完成步骤。这会导致主线程暂停,这个暂停代表了Major GC的总暂停时间。然后主线程再次扫描根以确保所有活动对象都被标记,然后在几个助手的帮助下开始并行压缩和指针更新。并非旧空间中的所有页面都可以被压缩,因此不符合条件的页面将使用前面提到的空闲列表进行清理。在暂停期间,主线程还会启动并发清理任务,这些任务与并行压缩任务和主线程本身同时运行。即使 JavaScript 在主线程上运行,这些任务也可以继续。

在这里插入图片描述

总结

在本文中,讨论了 V8 垃圾收集器的工作原理以及它为何如此工作。还解释了堆被分为 Minor GCMajor GC 两个子类的原因,以及每种垃圾收集的算法如何发挥作用。此外,还从操作系统及其线程的角度描述了这些进程如何运行。

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

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

相关文章

three.js第一课

官网 1.创建场景 2.创建几何体 3.创建材质 4.创建网格模型 5.将几何体、材质加入网格模型,设置网格模型的位置,将网格模型加入场景中 6.创建相机,构造函数中设置角度、最后面视椎体的长宽比,相机离视椎体近端面的距离、视椎体的远…

算法训练营第二天 | 977.有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵II

问题( 一 ) 问题描述: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序 题目链接: 力扣(LeetCode)官网 - 全球极客挚爱…

并发编程- 线程池ForkJoinPool工作原理分析(实践)

数据结构加油站: Comparison Sorting Visualization 并发设计模式 单线程归并排序 public class MergeSort {private final int[] arrayToSort; //要排序的数组private final int threshold; //拆分的阈值,低于此阈值就不再进行拆分public MergeSort…

重学JDK8新特性之Stream

集合处理数据的弊端 当我们在需要对集合中的元素进行操作的时候&#xff0c;除了必需的添加&#xff0c;删除&#xff0c;获取外&#xff0c;最典型的操作就是 集合遍历 public static void main(String[] args) {// 定义一个List集合List<String> list Arrays.asList…

流程引擎-自定义函数的应用

背景&#xff1a; 某些业务需求比较特殊&#xff0c;需要在表单中校验或实现一些功能&#xff0c;泛微流程表单配置时实现的方式多种多样&#xff1a;JS脚本、SQL语句、公式以及其他一些标准化拖拽功能&#xff0c;本次给大家分享一下流程表单中的公式实现的一些需求场景。泛微…

动态组件<component>

用法&#xff1a; <template><div><Navbar></Navbar><Home v-if"componentName 首页"></Home><List v-else-if"componentName 列表"></List><Center v-else-if"componentName 我的">…

公众号爆文写作怎么做?或许这些领域才适合你!

最近分享了很多爆款案例&#xff0c;看了的人都在跟进&#xff0c;有些人做得很出色&#xff0c;持续出爆款&#xff0c;但还是有人遇到了瓶颈&#xff0c;阅读量停滞不前。 其实&#xff0c;能否成功与个人能力、经验、环境以及一丢丢的运气有关。 但是&#xff0c;公众号不止…

PTL电子标签助力仓储行业转型升级提升拣货效率降低误差率

在智能物流、智能工厂和智能零售等行业的快速发展中&#xff0c;电子货位标签、物流智能设备和专业智能穿戴产品的应用变得越来越重要。这些技术的引入为仓储行业带来了巨大的变革和提升。作为一家致力于电子货位标签、物流智能设备和专业智能穿戴产品的开发和市场推广的公司&a…

windows10下SQL Prompt安装和注册

文章目录 windows10下SQL Prompt安装下载安装程序安装关闭联网注册机使用测试卸载 windows10下SQL Prompt安装 下载安装程序 官网 下载后 安装 双击打开界面 关闭联网 激活失效&#xff1a; 方法1&#xff1a;在本地hosts加入以下代码&#xff1a; 127.0.0.1 licensin…

Fabric.js 自定义控件

本文简介 带尬猴&#xff0c;我是德育处主任 虽然 Fabric.js 提供的基础功能已经很丰富了&#xff0c;但有时难免需要定制一些需求。比如本文要讲的 『自定义控件』。掌握创建自定义控件这个功能&#xff0c;能够创建更加精美和实用的图形应用程序&#xff0c;提高用户体验和用…

pycharm远程连接Linux服务器

文章目录 一&#xff1a;说明二&#xff1a;系统三&#xff1a;实现远程连接方式一&#xff1a; 直接连接服务器不使用服务器的虚拟环境步骤一&#xff1a;找到配置服务器的地方步骤二&#xff1a;进行连接配置步骤三&#xff1a;进行项目文件映射操作步骤四&#xff1a;让文件…

【JavaSE专栏53】Java集合类HashMap详解

Java集合类HashMap详解 摘要引言1. HashMap简介&#xff1a;掌握什么是HashMap&#xff1f;&#x1f9d0;2. HashMap的操作技巧&#xff1a;从基础到高级&#x1f680;2.1 添加键值对&#xff1a;put(K key, V value) &#x1f4e5;2.2 获取值&#xff1a;get(Object key) &…

ORACLE数据库查询所有索引的sql语句

SELECT * FROM ALL_INDEXES WHERE TABLE_NAMEB_CONFIG; 举例&#xff1a;

PCIE-Malformed tlp,UR,UC,CA

Malformed TLP (1)收到的cpl&#xff0c;actual payload 不等于length&#xff1b; (2)收到的cpl&#xff0c;违背了RCB准则&#xff1b; (3)Local tlp prefix不在end-end tlp prefix前&#xff1b; (4)不支持local tlp prefix的设备&#xff0c;同时extended fmt field为1…

提升用户体验的关键步骤

快速搭建功能齐全的户外帐篷用具小程序&#xff0c;是现今越来越流行的一种商业模式。通过将线下的户外用品店转移到线上&#xff0c;不仅可以减少人力成本和租金等固定支出&#xff0c;还可以为用户提供更便捷的购物体验。因此&#xff0c;学习如何快速搭建一个功能齐全的户外…

面向对象(基础)知识点强势总结!!!

文章目录 一、知识点总结&#xff08;1&#xff09;面向过程VS面向对象&#xff08;2&#xff09;类、对象&#xff08;3&#xff09;类的成员之一&#xff1a;属性&#xff08;或成员变量&#xff09;&#xff08;4&#xff09;类的成员之二&#xff1a;方法&#xff08;5&…

echarts折线图y轴刻度自适应

在做温湿度趋势曲线图时&#xff0c;我碰到了如下图这样的问题。我的实际值&#xff0c;都没有超过100的刻度的&#xff0c;但是他y轴的刻度线都到了250去了&#xff0c;这样完全不对。 尝试过强行给y周刻度设置最大最小值 &#xff0c;但是结果也不对。 yAxis: { type: value…

知识付费系统的移动应用开发:跨平台和原生应用的比较

移动应用在知识付费系统中发挥着重要作用&#xff0c;为用户提供了便捷的访问方式。在开发知识付费系统的移动应用时&#xff0c;开发团队通常需要考虑使用跨平台开发工具或原生开发。本文将比较这两种方法&#xff0c;讨论它们的优点和缺点&#xff0c;并提供示例代码来说明它…

正确部署Baichuan2(Ubuntu20.4) 步骤及可能出现的问题

部署其实是不太复杂的,但实际上也耗费了接近2-3天的时间去不断的设置 1 硬件配置信息 采用esxi 虚拟化的方式将T4 卡穿透给esxi 种的ubuntu20.4虚拟机 CPU给到8 core 内存至少32GB以上 T4卡是16GB 2 预先准备OS环境 这里使用的是ubuntu20.4版本,esxi中需要设置uefI启动方…

深入浅出排序算法之简单选择排序

目录 1. 原理和执行流程 2. 代码实现 3. 性能分析 4. 双向选择排序&#xff08;了解&#xff09; 1. 原理和执行流程 选择排序包含了堆排序和简单选择排序。 每一次从无序区间选出最大&#xff08;或最小&#xff09;的一个元素&#xff0c;存放在无序区间的最后&#xff0…