今天我们讲一下关于V8中的内存机制、隔离实例、上下文、脚本。
内存机制
1.基本概念
在Chrome V8中,内存机制是非常重要的,其中就包含它内在的各种概念。V8高效的一个重要原因就是它的内存机制。
Chrome V8中JavaScript的数据类型(Number、Object、Function等)都是由V8内部的内存机制进行管理的。也就是说如果你在自己的JavaScript代码中声明了一个变量/函数/对象,那么这个变量/函数/对象将被V8的内存机制进行管理。
Chrome V8所创建的C++类型能被你编写的C++代码(如C++扩展)所访问,并且其跟JavaScript中操作的是在内存中相同的存储单元。比如说你在JavaScript中声明了let a = 1;,那么在C++扩展中是可以被访问到的。
举个例子,在JavaScript中定义了一个字符串:
let a = "hello world"
Chrome V8会对应的创建一个v8::String类型的对象,里面有一堆Chrome V8内置的数据信息。
这些数据类型中都有对数据元信息的一个引用,用于内存管理。
2.堆内存类型
堆内存类型有以下几种:
- 新生代内存区:基本的数据对象(小数据对象)都被分配到这里,其特点是小而频,也就是空间小,垃圾回收频繁。
- 老生代指针区:这是一堆指向老生代内存区具体数据内容的指针。
- 老生代数据区:存放数据对象,在新生代内存区中经过 “晋升” 的数据都会放到这里。
- 大对象区:这里存放体积超越其他区大小的对象,每个对象有自己的内存,垃圾回收并不会移动大对象。
- 代码区:代码对象,这里的代码是JavaScript经过JIT编译生成的对象。
- Cell区、属性Cell区、Map区:存放Cell、属性Cell和Map。
3.堆内存的垃圾回收机制
1.新生代的垃圾回收机制
新生代内存使用Scavenge算法进行回收,该算法的大致思想为,将内存一分为二,每部分的空间都被称为Semispace。在Semispace中,总有一个处于使用状态,称为From空间;另一个处于空闲状态,称为To空间。
在分配对象时,总使用From空间进行分配;在垃圾回收时,Chrome V8检查From空间中的存活对象,然后将这些对象复制到To空间中,剩下的对象就会被释放,完成复制后From空间和To空间的角色对调,原来的From空间变成