我的编程空间,编程开发者的网络收藏夹
学习永远不晚

V8 内存管理(垃圾回收机制)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

V8 内存管理(垃圾回收机制)

1.1 栈

  • 栈用于存放 JS 中的基本类型和引用类型指针
  • 栈的空间是连续的,增加删除只需要移动指针,操作速度非常快
  • 栈的空间是有限的,当栈满了,就会抛出一个错误
  • 栈一般是在执行函数时创建的,在函数执行完毕后,栈就会被销毁

1.2 堆

  • 堆主要用于存储 JS 中的引用类型

1.2.1 堆空间分类

1.2.1.1 新生代(new space)

  • 新生代内存用于存放一些生命周期比较短的对象数据

1.2.1.2 老生代(old space)

  • 老生代内存用于存放一些生命周期比较长的对象数据
  • 当new space的对象进行两个周期的垃圾回收后,如果数据还存在new space中,则将他们存放到old space中
  • Old Space 使用标记清除标记整理的方式进行垃圾回收

1.2.2 什么是垃圾

  • 在程序运行过程中肯定会用到一些数据,这些数据会放在堆栈中,但是在程序运行结束后,这些数据就不会再被使用了,那些不再使用的数据就是垃圾

1.2.3 新生代的垃圾回收

  • 新生代内存有两个区域,分别是对象区域(from) 和 空闲区域(to)
  • 新生代内存使用Scavenger 算法来管理内存,垃圾回收的入口广度优先遍历 From-Space 中的对象,从根对象出发,广度优先遍历所有能到达的对象,把存活的对象复制到 To-Space遍历完成后,清空 From-SpaceFrom-Space 和 To-Space 角色互换
  • 复制后的对象在 To-Space 中占用的内存空间是连续的不会出现碎片问题
  • 这种垃圾回收方式快速而又高效,但是会造成空间浪费(有 To-Space 空闲区域)
  • 新生代的 GC 比较频繁
  • 新生代的对象转移到老生代称为晋升 Promote,判断晋升的情况有两种经过一次 GC 还存活的对象对象复制到 To-Space 时,To-Space 的空间达到一定的限制(超过 25%)

1.2.4 老生代的垃圾回收

V8 在老生代中的垃圾回收策略采用Mark-Sweep(标记清除)和 Mark-Compact(标记整理)相结合

1.2.4.1 Mark-Sweep(标记清除)

  • 标记清除分为标记和清除两个阶段
  • 在标记阶段需要遍历(深度优先遍历)堆中的所有对象,并标记那些活着的对象,然后进入清除阶段。在清除阶段总,只清除没有被标记的对象
  • V8 采取的是黑色和白色来标记数据,垃圾收集之前,会把所有的数据设置为白色,用来标记所有的尚未标记的对象,然后会从 GC 根出发,以深度优先的方式把所有的能访问到的数据都标记为黑色,遍历结束后黑色的就是活的数据,白色的就是可以清理的垃圾数据
  • 由于标记清除只清除死亡对象,而死亡对象在老生代中占用的比例很小,所以效率较高
  • 标记清除有一个问题就是进行一次标记清楚后,内存空间往往是不连续的,会出现很多的内存碎片。如果后续需要分配一个需要内存空间较多的对象时,如果所有的内存碎片都不够用,就会出现内存溢出的问题

1.2.4.2 Mark-Compact(标记整理)

  • 标记整理正是为了解决标记清除所带来的内存碎片的问题
  • 标记整理在标记清除的基础进行修改,将其的清除阶段变为紧缩极端
  • 在整理的过程中,将活着的对象向内存区的一段移动,移动完成后直接清理掉边界外的内存
  • 紧缩过程涉及对象的移动,所以效率并不是太好,但是能保证不会生成内存碎片,一般 10 次标记清理会伴随一次标记整理

1.2.5 优化

  • 在执行垃圾回收算法期间,JS 脚本需要暂停,这种叫 Stop the world(全停顿)
  • 如果回收时间过长,会引起卡顿
  • 性能优化把大任务拆分小任务,分步执行,类似 fiber将一些任务放在后台执行,不占用主线程

JavaScript执行 垃圾标记、垃圾清理、垃圾整理 JavaScript执行
-------------- ---------------->

1.2.5.1 Parallel(并行执行)

  • 新生代的垃圾回收采取并行策略提升垃圾回收速度,它会开启多个辅助线程来执行新生代的垃圾回收工作

-------辅助线程----->
-------辅助线程----->
-------辅助线程----->
--------- --------------------------->

1.2.5.2 增量标记

  • 老生代因为对象又大又多,所以垃圾回收的时间更长,采用增量标记的方式进行优化
  • 增量标记就是把标记工作分成多个阶段,每个阶段都只标记一部分对象,和主线程的执行穿插进行
  • 为了支持增量标记,V8 必须可以支持垃圾回收的暂停和恢复,所以采用了黑白灰三色标记法黑色表示这个节点被 GC 根引用到了,而且该节点的子节点都已经标记完成了灰色表示这个节点被 GC 根引用到了,但子节点还没被垃圾回收器标记处理,也表明目前正在处理这个节点白色表示此节点还没未被垃圾回收器发现,如果在本轮遍历结束时还是白色,那么这块数据就会被收回
  • 引入了灰色标记后,就可以通过判断有没有灰色节点来判断标记是否完成了,如果有灰色节点,下次恢复的应该从灰色节点继续执行

---------开始标记---增量标记---增量标记---清理---整理----------------->

1.2.5.3 Write-barrier(写屏障)

  • 当黑色指向白色节点的时候,就会触发写屏障,这个写屏障会把白色节点设置为灰色

global.a = { name: "a" }
global.a.b = { name: "b1" }
//执行标记工作
global.a.b = { name: "b2" }
//继续执行标记工作

1.2.5.4 Lazy Sweeping(惰性清理)

  • 当增量标记完成后,如果内存够用,先不清理,等 JS 代码执行完慢慢清理

1.2.5.5 concurrent(并发回收)

  • 其实增量标记和惰性清理并没有减少暂停的总时间
  • 并发回收就是主线程在执行过程中,辅助线程可以在后台完成垃圾回收工作
  • 标记操作全都由辅助线程完,清理操作由主线程和辅助线程配合完成

----辅助线程标记---->      -----清理整理---->
----辅助线程标记----> -----清理整理---->
----辅助线程标记----> -----清理整理---->
-----------------------------执行JS>-----清理整理--->-------------------------

文章出自:​​前端餐厅​​,如有转载本文请联系前端餐厅ReTech今日头条号。

github:​​https://github.com/zuopf769​

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

V8 内存管理(垃圾回收机制)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

V8 内存管理(垃圾回收机制)

在程序运行过程中肯定会用到一些数据,这些数据会放在堆栈中,但是在程序运行结束后,这些数据就不会再被使用了,那些不再使用的数据就是垃圾
V8内存管理2024-11-30

PHP 垃圾回收机制与内存管理

php 的内存管理使用垃圾回收机制,它会在运行时自动释放不再使用的内存,基于引用计数原理运作。为了避免内存泄漏,遵循以下最佳实践:销毁不再需要的变量、避免循环引用、使用弱引用。PHP 垃圾回收机制与内存管理PHP 中的内存管理PHP 使
PHP 垃圾回收机制与内存管理
2024-05-03

Python的内存管理和垃圾回收机制

本篇内容介绍了“Python的内存管理和垃圾回收机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对象的内存使用赋值语句是语言最常见的功能了
2023-06-02

V8 堆外内存 ArrayBuffer 垃圾回收的实现

本文介绍堆外内存的一种类型 ArrayBuffer 的 GC 实现。
内存堆外GC2024-12-02

php内存管理机制与垃圾回收机制的示例分析

这篇文章给大家分享的是有关php内存管理机制与垃圾回收机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、内存管理机制先看一段代码:
2023-06-15

深入理解谷歌最强V8垃圾回收机制

有很多人都听说过V8引擎,但可能不是很了解,V8名称叫Chrome V8,是由谷歌开源的一个高性能 JavaScript 引擎。该引擎采用 C++ 编写,Google Chrome 浏览器用的就是这个引擎。V8 可以单独运行,也可以嵌入 C
V82024-12-10

web前端中V8的垃圾回收和内存限制如何理解

这篇文章将为大家详细讲解有关web前端中V8的垃圾回收和内存限制如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言在第三次浏览器大战中,来自Google的Chrome浏览器凭借优异的
2023-06-04

垃圾回收机制

我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是一个垃
2023-01-30

一文搞懂V8引擎的垃圾回收机制

我们平时在写代码的过程中,好像很少需要自己手动进行垃圾回收,那么V8是如何来减少内存占用,从而避免内存溢出而导致程序崩溃的情况的。为了更高效地回收垃圾,V8引入了两个垃圾回收器,它们分别针对不同场景进行工作。

探索Go语言的内存管理特点和垃圾回收机制

探索Go语言的垃圾回收机制与内存管理特点引言:随着互联网的发展,开发者们对于编程语言的要求也越来越高。Go语言作为一种静态类型、编译型语言,自诞生之初就凭借其高效的垃圾回收机制和内存管理特点备受关注。本文旨在深入探索Go语言的垃圾回收机制
探索Go语言的内存管理特点和垃圾回收机制
2024-01-23

C++ 内存管理中的自动垃圾回收

c++++ 中自动垃圾回收需要使用第三方工具或库。可以使用智能指针或垃圾回收器库。智能指针自动释放底层对象,而垃圾回收器库使用算法跟踪不再使用的数据结构。案例:使用智能指针 std::shared_ptr;使用 libgc 库 gc_mal
C++ 内存管理中的自动垃圾回收
2024-05-04

理解Python垃圾回收机制

一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。#encoding=utf-8 __autho
2022-06-04

python垃圾回收机制!

python的三种垃圾回收机制:1.python采用的是引用计数机制为主;2.标记-清除;为辅的策略3.分代收集(隔代回收、分代回收)为辅的策略现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存
2023-01-31

day09(垃圾回收机制)

1,复习文件处理1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写with open('
2023-01-31

在 Java 中怎样进行内存管理以及垃圾回收?(Java中如何进行内存管理与垃圾回收)

在Java中,内存管理和垃圾回收是非常重要的概念,它们对于程序的性能和稳定性起着关键作用。本文将详细介绍Java中如何进行内存管理与垃圾回收。一、内存管理的基本概念内存管理主要涉及到内存的分配和释放。在Java中,内
在 Java 中怎样进行内存管理以及垃圾回收?(Java中如何进行内存管理与垃圾回收)
Java2024-12-15

JVM分代垃圾回收机制和垃圾回收算法

在C/C++中,我们需要用到内存的时候,需要先手动申明一下,使用完后又需要在手动回收一下,这两部非常麻烦而且还经常会出这个方面的问题。而这一切在Java中就已经被自动执行掉了,所以我们写代码的时候都不用再管这些无效的数据。
JVM回收算法2024-12-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录