v8执行js过程、垃圾回收、内存泄漏

v8执行js代码的过程

1.将源代码生成抽象语法树AST:源代码进行词法分析和语法分析后生成AST 

2.生成字节码:根据AST生成字节码,字节码通过解释器转换为机器码才能执行

3.执行代码:如果一段字节码是第一次执行,解释器会逐行执行;如果在执行字节码过程中发现有热点函数,JIT即时编译器就会把热点函数编译为机器码,并保存起来,下次就可以直接使用了,省去了将字节码转换为机器码的过程,提升了执行效率

垃圾回收

新生代内存回收

新生代中用 Scavenge 算法来处理。所谓 Scavenge 算法,是把新生代空间对半划分为两个区域,一半是对象区域(from),一半是空闲区域 (to)。

老生代内存回收

新生代中多次进行回收仍然存活的对象会被转移到空间较大的老生代内存中,这种现象称为晋升。以下两种情况:

  1. 在垃圾回收过程中,发现某个对象之前被清理过,那么将会晋升到老生代的内存空间中
  2. 在 from 空间和 to 空间进行反转的过程中,如果 to 空间中的使用量已经超过了 25% ,那么就讲 from 中的对象直接晋升到老生代内存空间中。

标记-清除(Mark-Sweep)

标记-整理(Mark-Compact)

增量标记

回答问题

哪些操作会造成内存泄漏?

  1. 意外的全局变量:无法被回收

  2. 被遗忘的定时器或回调函数:导致所引用的外部变量无法被释放

  3. 脱离 DOM 的引用:dom 元素被删除时,内存中的引用未被正确清空

  4. 闭包:会导致父级中的变量无法被释放

参考:

V8引擎详解(一)——概述

V8引擎详解(二)——AST

V8引擎详解(四)——字节码是如何执行的

V8引擎详解(五)——内联缓存

V8引擎详解(六)——内存结构

V8引擎详解(七)——垃圾回收机制

Chrome 浏览器垃圾回收机制与内存泄漏分析

从敲下一行JS代码到这行代码被执行,中间发生了什么?

V8 的内存管理和垃圾回收

V8内存管理及垃圾回收机制

V8 引擎垃圾内存回收原理解析

JavaScript中V8引擎内存问题

浅谈V8引擎中的垃圾回收机制

【必会基础】V8如何执行JavaScript?

高级前端基础-JavaScript抽象语法树AST

JS高程中的垃圾回收机制与常见内存泄露的解决方法

[译] 通过垃圾回收机制理解 JavaScript 内存管理

【JSConf EU 2018】JavaScript引擎: 精粹部分

JavaScript代码是如何被执行的

「每周前端面试题专栏」- 滴水之功,开拓大厂之路(第一周)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值