Node.js的C++扩展教程(二)

本文介绍了V8引擎中的内存管理,包括新生代和老生代的垃圾回收策略,以及C++扩展中的隔离实例概念。同时,阐述了上下文对象在JavaScript执行环境中的作用,以及脚本对象的特性。
摘要由CSDN通过智能技术生成

今天我们讲一下关于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空间变成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值