V8工作原理(回收垃圾編譯)

admin admin
2024-07-21
(Number\String\Boolean\undefined\null\BigInt\Symbol)和1种引用类型(Object)。原始类型的赋值会完整的赋值变量值,引用类型的赋值是复制引用地址。JavaScript 的内存模型分为三种:代码空间、栈空间、堆空间。栈空间和堆空间原始类型的数据存放在栈中,引用……

(Number\String\Boolean\undefined\null\BigInt\Symbol)和1种引用类型(Object)。
原始类型的赋值会完整的赋值变量值,引用类型的赋值是复制引用地址。

JavaScript 的内存模型分为三种:代码空间、栈空间、堆空间。

栈空间和堆空间

原始类型的数据存放在栈中,引用类型存在堆中。
堆中的数据是通过引用和变量关联起来的,JavaScript 的变量没有数据类型,值才有数据类型,变量可以持有任何数据类型的数据。

V8工作原理(回收垃圾編譯)
(图片来源网络,侵删)

堆空间存储

为什么引用数据类型放在堆空间?因为该类型数据占用的空间往往比较大,如果放在栈中,会影响到调用栈的执行上下文的切换效率,也可能导致栈空间不足;而堆空间比较大,能存放很多大的数据。

垃圾回收机制

程序中,有些数据在使用之后,我们不再需要了,这种数据就称为垃圾数据。
只有回收了垃圾数据,才能释放内存空间,无法回收或回收不及时的情况,我们就称为内存泄漏。

JavaScript 的垃圾是由垃圾回收器自动回收的。
数据存放在“栈空间”和“堆空间”,那垃圾回收器是如何回收的呢?

调用栈中的数据是如何回收的

调用栈在入栈时存储上下文数据,当某上下文执行完成出栈(pop stack) 后,就销毁掉了执行上下文,相应的内存空间就会被回收。

调用栈中通过记录当前执行状态的指针(称为 ESP)下移操作,来销毁执行完毕的函数存在栈中的执行上下文的过程。

堆中的数据是如何回收的

回收堆中的垃圾数据,如要利用 JavaScript 的垃圾回收器。

代际假说和分代收集

代际假说(The Generational Hypothesis)

第一个是大部分对象在内存中存在的时间很短,就是很多对象一经过分配内存,很快就变得不可访问。
第二个是不死的对象,会活得更久。

V8 中会把堆分为新生代和老生代两个区域,新生代中存放的是生存时间短的对象,老生代中存放的生存时间久的对象。
新生代区通常只支持 1~8M 的容量,老生代区则容量大很多。
这两块区域,V8分别使用了不同的垃圾回收器,以便更高效的实施垃圾回收。

副垃圾回收器,主要负责新生代的垃圾回收。
主垃圾回收器,主要负责老生代的垃圾回收。
垃圾回收器的工作流程1、标记空间汇总活动对象和非活动对象2、回收非活动对象所占据的内存3、内存整理

副垃圾回收器使用 Scavenge 算法 结合 对象晋升策略。

主垃圾回收器使用 标记-清除(Mark-Sweep)算法进行垃圾回收,然后使用标记-整理(Mark-Compact) 进行内存整理。

全停顿

由于垃圾回收器是运行在 JavaScript 主线程上的,单线程的原因,执行垃圾回收算法的时候使得 JavaScript 脚本执行暂停,导致性能下降。
为了解决这个问题,V8 将垃圾回收中的标记过程分为一个个的子标记过程,同时让垃圾回收标记和 JavaScript 应用逻辑交替进行,知道标记阶段完成(增量标记 Incremental Marking 算法)。

编译器和解析器

编译型语言 在执行程序之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件,这样每次运行程序时,都可以直接运行该二进制文件,而不需要再次重新编译了。
比如 C/C++、GO、Java等。

解释型语言 在每次运行时都需要通过解释器对程序进行动态的解释和执行。
比如 Python、JavaScript。

JS 代码编译解析执行过程

V8 依据 JavaScript 代码生成 AST 和执行上下文,再基于 AST 生成字节码(编译),然后通过解释器执行字节码,通过编译器来优化编译字节码。

JavaScript 中编译面向的是全局代码或函数,比如下载完一个js文件,先编译这个js文件,但是js文件内定义的函数是不会编译的,等调用到该函数的时候,JavaScript 引擎才会去编译该函数。

可以吧 JavaScript 的编译看成部分:

第一部分从一段 JavaScript 代码编译到字节码,然后解释器解释执行字节码;第二部分深度编译,将活跃的字节码编译成二进制,然后直接执行二进制。

本文来自:《浏览器的工作原理与实践》极客时间-李兵 的学习笔记记录

其他相关 RELEVANT MATERIAL
他们用勤劳和智慧扮靓厦门!今日致敬城市美容师(環衛垃圾分類)

他们用勤劳和智慧扮靓厦门!今日致敬城市美容师(環衛垃圾分類)

admin admin
5
2024-07-23
有这么一群人,晨曦中,他们用忙碌的身影唤醒沉睡的城市;他们用晶莹的汗水,擦亮城市的“高颜值”;在城市的大街小巷,随处都能看到那抹橙,他们有一个共同的名字——环卫工人。  今天是厦门市第32届环卫工人节,今年10月是福建省第4个“环卫工人关爱月”,让我们一起对城市美容师们说声:你们辛苦了!  垃圾分类工作连续21……...
清理心灵的垃圾_让心灵自由呼吸(心靈垃圾清理)

清理心灵的垃圾_让心灵自由呼吸(心靈垃圾清理)

admin admin
3
2024-07-23
现在的社会,随着物质条件的提高还有对健康的关注意识越来越强,人们对自己的卫生要求也越来越严,家里经常打扫的是窗净几明,自己也每天也打扮地光鲜靓丽,优雅出门,定期去美容院减肥美容的比比皆是,以便清除体内垃圾和毒素,一些药房的排毒养颜的保健品一直也大行其道.......当然为了健康和美丽,这都无可厚非,至于作用多大……...
“城市美容师”早出晚归不休假 他们的春节不一样(垃圾遂昌他們的)

“城市美容师”早出晚归不休假 他们的春节不一样(垃圾遂昌他們的)

admin admin
3
2024-07-23
(新春见闻)“城市美容师”早出晚归不休假 他们的春节不一样中新网丽水2月14日电( 奚金燕 实习生 李林蔚)“卖发糕,卖对联,卖鱼喽”,伴随着小贩们的阵阵吆喝声,浙江省遂昌县城的年味渐浓。年前最后一个集市日,集市现场人山人海,场面十分壮观,但人群中有几抹橙色格外耀眼,他们就是这座城市的环卫工人。过年了,环卫工人……...
“城市美容师”同台竞技“秀”分类(美容師同臺分類)

“城市美容师”同台竞技“秀”分类(美容師同臺分類)

admin admin
3
2024-07-23
10月26日是“环卫工人节”。为广泛宣扬环卫精神,引导社会各界更加关心、支持和参与环卫工作,让关爱环卫工人、珍惜环卫成果在全社会蔚然成风,当日下午,浙江省台州温岭市箬横镇环卫所联合该镇垃圾分类办共同举行“垃圾不落地,我是‘城市美容师’我先行”主题活动。全镇部分环卫工人齐聚一堂、同台竞技,在玩转“拉风‘大富翁……...
挥帚三十载_她是最美城市美容师(清運極目搖鈴)

挥帚三十载_她是最美城市美容师(清運極目搖鈴)

admin admin
3
2024-07-22
通讯员 王乐 潘登2月27日凌晨4时许,在仙桃大道西端的江汉平原农贸大市场内灯火通明,人声鼎沸,带着露水的蔬菜、活蹦乱跳的鲜鱼……在黎明到来之前都将被装车,发往各地。随着货物的热销,各类生活垃圾源源不断地产生,堆入市场的清运角落,仙桃市环卫局洁达公司城西线经理曾翠红带领着环卫工人们不停清扫搬运,保证市场的洁净……...
向惠州城市美容师致敬!(環衛垃圾中轉站)

向惠州城市美容师致敬!(環衛垃圾中轉站)

admin admin
5
2024-07-22
环卫工人在东江进行江面保洁“白鹿”台风扫过,环卫工人迅速上街冒着大雨清理刮断枝叶凌晨4点,负责清扫合生大桥的环卫工人张顺枝已在为桥面做保洁清理。合生大桥车流量大,只有凌晨三四点时车辆少一点,多年以来,4点左右到岗成了张顺枝的工作常态。10月26日是我省广大环境卫生战线职工的节日——环卫工人节。下面让我们一起走进……...
最新评论
年度爆文