返回

揭开V8引擎系列第三篇:Memory Structure and GC

前端




        
## V8 引擎系列(3):Memory Structure and GC
        
---
        
在上一篇文章中,我们对 V8 引擎的整体架构进行了概述,了解了 V8 引擎是如何将 JavaScript 代码编译成机器代码并在计算机上运行的。在本篇文章中,我们将深入探讨 V8 引擎的内存结构以及垃圾回收机制,帮助您全面了解 V8 引擎是如何管理内存并回收不再使用的对象的。
        
### 一、V8 引擎的内存结构
        
一个正在运行的程序在 V8 中被分配的内存空间被称为 Resident Set。Resident Set 包含了各种数据结构,其中包括:
        
- **栈 (Stack):**  栈是用于存储函数调用帧的数据结构。当一个函数被调用时,它的调用帧会被推入栈中,其中包含了函数的参数、局部变量和返回地址。当函数返回时,它的调用帧会被从栈中弹出。
        
- **堆 (Heap):**  堆是用于存储动态分配的对象的数据结构。当一个对象被创建时,它会被分配到堆中。当对象不再被使用时,它会被垃圾回收机制回收。
        
- **堆外内存 (Off-Heap Memory):**  堆外内存是用于存储那些不属于堆的数据结构。例如,代码本身就被存储在堆外内存中。堆外内存也用于存储一些特殊的数据结构,例如 TypedArray 和 WebAssembly 模块。
        
- **元空间 (Metaspace):**  元空间是用于存储类信息的数据结构。类信息包括类的名称、父类、方法和属性等信息。元空间通常位于堆外内存中。
        
- **引用 (References):**  引用是用于指向另一个对象的数据结构。引用可以是强引用或弱引用。强引用是指引用对象必须一直存在,否则就会导致程序崩溃。弱引用是指引用对象可以被垃圾回收机制回收。
        
### 二、V8 引擎的垃圾回收机制
        
V8 引擎使用标记-清除算法来进行垃圾回收。标记-清除算法的工作原理是:首先,它会标记所有可以从根对象到达的对象。然后,它会清除所有未被标记的对象。根对象是指那些从栈或寄存器中可以访问到的对象。
        
除了标记-清除算法,V8 引擎还使用标记-压缩算法来进行垃圾回收。标记-压缩算法的工作原理是:首先,它会标记所有可以从根对象到达的对象。然后,它会将所有未被标记的对象压缩到堆的末尾。这样可以减少堆的碎片,提高内存的利用率。
        
V8 引擎还使用增量标记算法来进行垃圾回收。增量标记算法的工作原理是:它会将垃圾回收任务分解成多个小的任务,并在应用程序运行时逐步执行这些任务。这样可以减少垃圾回收对应用程序性能的影响。
        
### 总结
        
在本篇文章中,我们对 V8 引擎的内存结构和垃圾回收机制进行了详细的探讨。我们了解了 V8 引擎是如何管理内存以及如何回收不再使用的对象的。这些知识对于我们理解 V8 引擎的内部工作原理是非常重要的。在下一篇文章中,我们将继续探讨 V8 引擎的其他功能和特性。