一、v8数据存放
在程序运行时,存放数据地方主要分为堆内存和栈内存
- 栈内存:因为使用的栈结构设计,所以叫栈内存,是一块连续的内存空间,处存储简单的数据,如基本类型(number、boolean、string)的值,复杂类型的堆内存指针也会存储在此,它是一个key、value的储存类型。栈内存的垃圾回收由系统自动直接管理,进行分配以及释放。
- 堆内存:是一块不连续的内存空间,效率不如栈,可以存储栈内存的所有能储存的数据并且存储object数据。需要v8引擎主动去进行垃圾回收,这篇文章讲解的也是堆内存的垃圾回收(栈内存已经是系统自动管理了)。其中堆内存分为了
-
新生代(New Space):最开始我们定义一个对象会先放入这里,一系列回收后还存在就会被放到老生代中
-
老生代(Old Space):存储一些在新生代中经久存活(活动)的对象 和全局变量如window、docuement等。
-
大对象空间(Large object space):存储一些超大对象,比如创建一个99999长度每个内容都有值的数组Array,那么此变量就会在这里创建存储,回收过程与老生代相同。
-
代码空间(Code-space):编译器存储编译(JIT)JavaScript代码后得到的代码的地方。
-
细胞空间,属性细胞空间,map 空间(Cell space, property cell space, and map space):这些空间分别包含:Cells, PropertyCells, 和 Maps。这些空间中的每个空间都包含相同大小的对象,并且对它们指向的对象有一些限制,从而简化了回收。
-
本文主要解析新生代(New Space)与老生代(Old Space)的GC过程。
看一个简单的例子,他们在内存中的分配
const a =