V8引擎
什么V8引擎
是由 C++ 编写的 Google 开源高性能 javascript 和 WebAssembly 引擎。他用于 Chrome和Node等。
是接收javsccript 代码,编译代码然后执行 C++ 的程序,编译后的代码可以在多种操作系统多种处理器运行
V8主要工作
- 编译和执行JS代码
- 处理调用杖
- 内存的分配
- 垃圾回收
V8引擎如何工作
- parser 解析器 生成AST抽象语法树
- interpreter 解释器 Ignition 生成byteCode字节码 并直接执行
- 清除AST 释放内存空间
- 得到25% - 50%的等效机器代码大小
- compiler 运行过程中,解释器收集优化信息发送给编译器TurboFan
- 重新生成机器码
- 有些热点函数变更会由优化后的机器码还原成字节码 也就是deoptimization 回退字节码操作执行
优化点:
- 值声明未调用,不会被解析生成AST
- 函数只被调用一次,bytcode直接被解释执行,不会进入到编译优化阶段
- 函数被调用多次,Igniton会收集函数类型信息,可能会被标记为热点函数,可能被编译成优化后的机器代码
1 | function sum (x,y){ |
- 在函数声明时,js引擎不知道道x,y是什么类型,但在后面多次调用中,传入道x,y都是整形,sum 函数被识别为热点函数。
- 解析器会把收集到道
类型信息
和该函数字节码
发送给编译器 - 编译器会生成优化后的机器代,会假定 x,y 为 int 类型,后面调用sum 函数后会直接运行更快的机器代码
- 如何传入了字符串,机器代码不知道处理字符串的参数,于是就需要进行
deoptimization
(回退到字节码),由解释器来解释执行 - 我们尽量不要把变量的类型变来变去,会给V8引擎损失一些性能。
调用栈
先进后出, 进栈,出栈,与堆栈不同
调用栈是JS引擎追踪函数执行流程的一种机制,当执行环境中调用了多个函数时,通过这种机制,我们能够追踪到哪个函数正在执行,执行的函数体又调用了哪个函数
由于 javascript 是单线程所以只能有一个调用栈
用栈持续被调用,会导致内存溢出
队列
先进先出(后进后出)
垃圾回收(Garbage Collection)
- 大多数对象都是隐私垃圾
Major GC (Full Mark-Compact)
什么是递归函数
- 持续占用内存,每调用一个函数都会执行上下文
- 本文作者: Littleki
- 本文链接: https:/littleki.gitee.io/2021/04/29/V8引擎/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!