资讯专栏INFORMATION COLUMN

V8 中的垃圾收集(GC),图文指南

scola666 / 2562人阅读

摘要:带有分代垃圾收集器,我将在后文解释。堆中的不同类型的对象会占用不同的空间,它将被组织成如下为了垃圾回收的目的,将堆分为两部分新生区和老生区。较旧的对象是幸存多于一个垃圾收集扫描的对象,这意味着它们仍然被其他对象引用,并且仍然需要占用该内存。

原文标题:Garbage collection in V8, an illustrated guide
原文链接:https://medium.com/@_lrlna/ga...
译者:@justjavac

本指南与我迄今为止所写的其他指南都不同,我在里面添加了一些草图。我用草图描绘了垃圾收集(GC)的整个概念以及它是如何在 javascript 中被处理的,更确切地说是在运行 javascript 的引擎中。顺便提一下,这个指南是面向初学者的,不包括 V8 内存管理的各个方面以及 V8 的内部原理。我添加了一些资源,可以帮助你更深入地了解。本指南重点介绍✨javascript✨,对于某些语言而言,垃圾收集是完全不一样的,比如 C 语言.

好的,我们开始吧。

什么是v8?

V8,是一个 JavaScript 的运行时引擎,不要与你最喜爱的番茄汁?混淆了,它负责编译并执行你精美的javascript。V8 带有分代垃圾收集器,我将在后文解释。它与 Chrome 一起,而 SpiderMonkey 是 Mozilla 的引擎 Chakra 是微软的。基本上当运行 javascript 时,您需要一个引擎来处理它,而且 V8 是您的选择之一,无论是在浏览器还是在 node.js 环境中。(P.S. V8 是✨ 开源的 ✨。)

什么是垃圾收集?

垃圾收集的重点是通过使用特定的程序来管理内存的使用。诸如 C 之类的语言通常可以直接操作程序中的内存,并在程序的上下文中分配和释放对象。另一方面,ECMAScript 缺少访问内存管理的特定接口(是的,这意味着没有API)。这基本上意味着程序中的所有内存管理权限都被转移到了 V8。

由于我们无法访问无限量的内存,因此垃圾收集器的工作是通过内存中分配的对象来确定它们是否死亡或是活动。那些活着的对象会留在内存中,那些死亡的对象被删除,内存被分配回堆。

什么是堆?堆是非结构化区域,堆中的对象占用分配的内存。这种分配是动态的,因为对象的大小/寿命/数量是未知的,所以需要在运行时分配和释放。

如果我们看一下并发模型,堆直接与调用栈一起工作,因为堆栈中的对象需要进行内存分配。它看起来像这样:

Dead or alive?

如何检查对象的生死,是通过客户机或者程序代码是否可以到达此对象。您可以想到的最容易达到的对象可能是根范围中定义的对象。

一些 C++ 绑定(或客户端上的 Web API)也是根的一部分,因此您可以通过例如 setInterval 直接访问。

可达性(Reachability)还可以这么理解:另一个对象或根是否可以获得它,如果可以的话,该对象所需的内存被保留。

那么我们怎么可以做到垃圾收集呢?(告诉我!告诉我!)

创建新对象或新的“指针”时,V8 会在堆中分配内存。(javascript 没有真正的指针,所以"指针"在技术上只是复制对原始对象的引用)。堆中的不同类型的对象会占用不同的空间,它将被组织成如下:

为了垃圾回收的目的,V8 将堆分为两部分:新生区和老生区。当您执行需要 V8 分配内存的操作时,V8 将在新生区中分配空间。当你继续添加到堆,你最终会耗尽内存,所以 V8 将不得不运行一个 GC 来清理。新创建的对象被分配得很快,并且当对象死亡时被清理(更短和更快的收集)。一旦对象“生存”了一些(确切的说是2个周期)回收扫描周期时,它们被提升到老生区,在一个多带带的循环中收集垃圾。

较旧的对象是幸存多于一个垃圾收集扫描的对象,这意味着它们仍然被其他对象引用,并且仍然需要占用该内存。他们通常不引用较年轻的对象,只是引用较旧的对象。大周期进行的并不频繁。一次大周期通常是在移动足够多的对象至老生区后才会发生。

? sources.js

内存管理; 我喜欢阅读 glossary 章节,你会发现很多 GC 的概念.

this is a really good and v detailed repo on v8’s perf.

您可以查看 v8 repo 的 wiki,了解更多内部信息,以及如何使用 v8 调试项目

on frame rates from firefox dev tools

另一个很好的指南 V8 && garbage collection

This guide is crossposted from lrlna’s sketchin guide on github ✨ ?.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91746.html

相关文章

  • 2017-09-13 前端日报

    摘要:前端日报精选中的垃圾收集,图文指南十个免费的前端开发工具专题之递归如何在链中共享变量基于的爬虫框架中文译十六进制颜色揭秘掘金掘金小书基本环境安装小书教程中间件对闭包的一个巧妙使用简书源码分析掘金组件开发练习焦点图切换前端学 2017-09-13 前端日报 精选 V8 中的垃圾收集(GC),图文指南十个免费的web前端开发工具JavaScript专题之递归 · Issue #49 · m...

    BWrong 评论0 收藏0
  • Node.js 指南(流中的背压)

    摘要:在数据缓冲区已超过或写入队列当前正忙的任何情况下,将返回。当返回值时,背压系统启动,它会暂停传入的流发送任何数据,并等待消费者再次准备就绪,清空数据缓冲区后,将发出事件并恢复传入的数据流。 流中的背压 在数据处理过程中会出现一个叫做背压的常见问题,它描述了数据传输过程中缓冲区后面数据的累积,当传输的接收端具有复杂的操作时,或者由于某种原因速度较慢时,来自传入源的数据就有累积的趋势,就像...

    Tony 评论0 收藏0
  • V8引擎】浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    摘要:一前言的垃圾回收机制使用垃圾回收机制来自动管理内存。垃圾回收器只会针对新生代内存区老生代指针区以及老生代数据区进行垃圾回收。分别对新生代和老生代使用不同的垃圾回收算法来提升垃圾回收的效率。 V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制。因此,V8 将内存(堆)分为新生代和老生代两部分。 一、前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存。垃...

    qingshanli1988 评论0 收藏0
  • javascript垃圾回收机制 - 标记清除法/引用计数/V8机制

    摘要:例如,和中的对象就是实现的对象,而对象的垃圾收集机制采用的是引用计数策略。因此,即使中的引擎使用标记清除策略实现,但是访问的对象依然是基于引用计数策略的。垃圾回收器从不移动大对象。 Js GC原理: 找出那些不再继续使用的变量,然后释放其所占用的内存,垃圾回收器会按照固定的时间间隔周期性地执行这一操作 Js GC 策略: 标记清除法 引用计数 JavaScript 内存分配: 在定...

    JellyBool 评论0 收藏0
  • Node - 内存管理和垃圾回收

    摘要:的内存限制和垃圾回收机制内存限制内存限制一般的后端语言开发中,在基本的内存使用是没有限制的。的内存分代目前没有一种垃圾自动回收算法适用于所有场景,所以的内部采用的其实是两种垃圾回收算法。 前言 从前端思维转变到后端, 有一个很重要的点就是内存管理。以前写前端因为只是在浏览器上运行, 所以对于内存管理一般不怎么需要上心, 但是在服务器端, 则需要斤斤计较内存。 V8的内存限制和垃圾回收机...

    joyqi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<