Fork me on GitHub

《浏览器工作原理与实践》读书笔记(2)

V8 工作原理

1.支持隐式类型转换的语言称为弱类型语言,不支持隐式类型转换的语言成为强类型语言。

2.javascript 是一种弱类型、动态的语言。弱类型是指它支持隐式类型转换;动态是可以用同一个变量保存不同的类型。

3.javascript 的内存空间:代码空间、栈空间和堆空间。

4.闭包原理:当编译器执行到外部函数的时候,会对内部做一次预扫描,如果扫描到闭包的话,就会把闭包引用的变量保存到closure对象里面去,然后把这个对象放到堆里面(即使引用的是基本类型,还是会存放到堆里面去。另外闭包是放在外层函数的变量环境中,而不是内层函数的变量环境中)。

5.垃圾回收:栈中的变量在执行结束之后,从执行上下文中直接销毁;堆中的变量就需要使用垃圾回收器来进行回收了。

6.在V8中,会把堆分为新生代和老生代两个区域,新生代内存小,主要存放生存时间短的对象;老生代内存大,主要存放生存时间长或者占用内存大的对象。

7.垃圾回收器的一般流程:标记空间中的活动对象和非活动对象;回收非活动对象所占的内存;最后做内存整理。

8.新生代的垃圾回收使用Scavenge算法,主要是把新生代的区域分隔成两份,然后把里面的对象在整理的时候复制到另一份里面去,就这样不停地翻转的过程。

9.老生代的垃圾回收使用标记-清除算法进行回收,然后使用标记-整理算法进行整理。

10.全停顿:V8会定时把主线程的脚本停下来,做一次垃圾回收,然后再恢复脚本执行。由于垃圾回收的耗时可能会很长,所以它使用增量标记算法把过程分为多个小的子任务间断执行。

11.V8执行 javascript 的过程(这种技术称为字节码 + JIT即时编译技术):

1.生成抽象语法树和执行上下文。(词法分析、语法分析)
2.使用解释器 Ignition 生成字节码。(对热点代码,就是多次执行的代码使用编译器 TurboFan 编译为高效的机器码)
3.执行代码。(使用解释器 Ignition 逐条执行字节码,或者直接执行机器码)

12.优化 javascript 性能的一些策略(中心主要在缩短单次脚本的执行时间和脚本的网络加载上):

1.提升单次脚本的执行速度(避免一直占用主线程影响交互)。
2.避免大的内联脚本(解析和编译会占用主线程)。
3.减少 javascript 文件总量(提升下载速度)。
posted @ 2020-10-30 22:25  馒头加梨子  阅读(104)  评论(0编辑  收藏  举报