文章 2023-02-23 来自:开发者社区

图解 Google V8 # 22 :关于内存泄漏、内存膨胀、频繁垃圾回收的解决策略(完结篇)

说明图解 Google V8 学习笔记几种内存问题内存问题可以定义为三类:内存泄漏 (Memory leak):导致页面的性能越来越差;内存膨胀 (Memory bloat):导致页面的性能会一直很差;频繁垃圾回收:导致页面出现延迟或者经常暂停。内存泄漏内存泄漏:当进程不再需要某些内存的时候,这些不再被需要的内存依然没有被进程回收。例子1:使用未定义的变量function foo() { ...

图解 Google V8 # 22 :关于内存泄漏、内存膨胀、频繁垃圾回收的解决策略(完结篇)
文章 2023-02-23 来自:开发者社区

图解 Google V8 # 21 :垃圾回收(二):V8是如何优化垃圾回收器执行效率的?

说明图解 Google V8 学习笔记全停顿(Stop-The-World)由于 JavaScript 是运行在主线程之上的,一旦执行垃圾回收算法,都需要将正在执行的 JavaScript 脚本暂停下来,待垃圾回收完毕后再恢复脚本执行。这种行为叫做全停顿(Stop-The-World)。全停顿的执行效果示意图:下面的 200 毫秒内无法执行其他事情,可能造成页面的卡顿 (Jank)。怎么解决垃圾....

图解 Google V8 # 21 :垃圾回收(二):V8是如何优化垃圾回收器执行效率的?
文章 2023-02-23 来自:开发者社区

图解 Google V8 # 20 :垃圾回收(一):V8的两个垃圾回收器是如何工作的?

说明图解 Google V8 学习笔记垃圾数据是怎么产生的?例子:window.test = new Object() window.test.a = new Uint16Array(100)上面代码内存布局图:在上面的基础上,添加代码执行:window.test.a = new Object()此时的内存布局:a 属性之前是指向堆中数组对象的,现在已经指向了另外一个空对象,此时堆中的数组对象就....

图解 Google V8 # 20 :垃圾回收(一):V8的两个垃圾回收器是如何工作的?
文章 2023-02-23 来自:开发者社区

图解 Google V8 # 19 :异步编程(二):V8 是如何实现 async/await 的?

说明图解 Google V8 学习笔记前端异步编程的方案史1、什么是回调地狱?如果在代码中过多地使用异步回调函数,会将整个代码逻辑打乱,从而让代码变得难以理解,这就是回调地狱问题。var fs = require('fs') fs.readFile('./src/kaimo555.txt', 'utf-8', function(err, data) { if (err) { ...

图解 Google V8 # 19 :异步编程(二):V8 是如何实现 async/await 的?
文章 2023-02-23 来自:开发者社区

图解 Google V8 # 18 :异步编程(一):V8是如何实现微任务的?

说明图解 Google V8 学习笔记宏任务和微任务宏任务指消息队列中的等待被主线程执行的事件。每个宏任务在执行时,V8 都会重新创建栈,然后随着宏任务中函数调用,栈也随之变化,最终,当该宏任务执行结束时,整个栈又会被清空,接着主线程继续执行下一个宏任务。微任务微任务其实是一个需要异步执行的函数,执行时机是在主函数执行结束之后、当前宏任务结束之前。为什么引入微任务?由于主线程执行消息队列中宏任务....

图解 Google V8 # 18 :异步编程(一):V8是如何实现微任务的?
文章 2023-02-23 来自:开发者社区

图解 Google V8 # 17:消息队列:V8是怎么实现回调函数的?

说明图解 Google V8 学习笔记什么是回调函数?只有当某个函数被作为参数,传递给另外一个函数,或者传递给宿主环境,然后该函数在函数内部或者在宿主环境中被调用,才称为回调函数。回调函数有两种不同的形式:同步回调:函数在执行函数内部被执行的;异步回调:函数在执行函数外部被执行的。UI 线程的宏观架构注意:在浏览器的页面里面是UI线程,node中就是它的主线程。什么是 UI 线程?所谓 UI 线....

图解 Google V8 # 17:消息队列:V8是怎么实现回调函数的?
文章 2023-02-23 来自:开发者社区

图解 Google V8 # 16:V8是怎么通过内联缓存来提升函数执行效率的?

说明图解 Google V8 学习笔记什么是内联缓存?    内联缓存(Inline caching)是部分编程语言的运行时系统采用的优化技术,最早为Smalltalk开发。内联缓存的目标是通过记住以前直接在调用点上方法查询的结果来加快运行时方法绑定的速度。内联缓存对动态类型语言尤为有用,其中大多数(如非全部)方法绑定发生在运行时,因此虚方法表通常无法使用。例子:functi....

图解 Google V8 # 16:V8是怎么通过内联缓存来提升函数执行效率的?
文章 2023-02-23 来自:开发者社区

图解 Google V8 # 15:隐藏类:如何在内存中快速查找对象属性?

说明图解 Google V8 学习笔记为什么静态语言的效率更高?静态语言中,可以直接通过偏移量查询来查询对象的属性值。比如下面例子:JavaScript 在运行时,对象的属性是可以被修改的,所以当 V8 使用了一个对象时,它并不知道该对象中是否有 x,也不知道 x 相对于对象的偏移量是多少。V8 会按照具体的规则一步一步来查询,这个过程非常的慢且耗时。C++ 代码在执行之前需要先被编译,编译的时....

图解 Google V8 # 15:隐藏类:如何在内存中快速查找对象属性?
文章 2023-02-23 来自:开发者社区

图解 Google V8 # 14:字节码(二):解释器是如何解释执行字节码的?

说明图解 Google V8 学习笔记在编译流水线中的位置字节码的解释执行在编译流水线中的位置:V8 源码目录:如何生成字节码?当 V8 执行一段 JavaScript 代码时,会先对 JavaScript 代码进行解析 (Parser),并生成为 AST 和作用域信息,之后 AST 和作用域信息被输入到一个称为 Ignition 的解释器中,并将其转化为字节码,之后字节码再由 Ignition....

图解 Google V8 # 14:字节码(二):解释器是如何解释执行字节码的?
文章 2023-02-23 来自:开发者社区

图解 Google V8 # 13:字节码(一):V8为什么又重新引入字节码?

说明图解 Google V8 学习笔记什么是字节码?    字节码(Byte-code)是一种包含执行程序、由一序列 op 代码/数据对组成的二进制文件。字节码是一种中间码,它比机器码更抽象。它经常被看作是包含一个执行程序的二进制文件,更像一个对象模型。字节码被这样叫是因为通常每个 opcode 是一字节长,但是指令码的长度是变化的。每个指令有从 0 到 255(或十六进制的....

图解 Google V8 # 13:字节码(一):V8为什么又重新引入字节码?

本页面内关键词为智能算法引擎基于机器学习所生成,如有任何问题,可在页面下方点击"联系我们"与我们沟通。