1. 核心架构:Isolate、Context 与句柄
里讲 V8 架构,先抓住三个词:Isolate、Context、Handle。
Isolate
Isolate 可以理解为一个独立的 JS 运行时实例,里面有堆、GC、编译状态、内建对象等资源。
常见回答:
- 一个进程里可以有多个
Isolate,它们的 JS 堆通常彼此隔离。 - 同一个
Isolate不适合被多个线程同时进入,多线程场景需要Locker或者拆成多个Isolate。 - Chrome、Node 都是通过嵌入 V8 API 创建和管理
Isolate。
Context
Context 是一个 JS 执行上下文,重点是 全局对象和内建对象的隔离。
可以这样区分:
Isolate更像运行时实例,粒度大。Context更像一套全局环境,粒度小。- 同一个
Isolate下可以有多个Context,例如 iframe、沙箱执行环境等。
global proxy
V8 暴露给 JS 的 global 通常不是直接的真实 global object,而是 global proxy。
它的作用是做安全隔离和嵌入层代理:浏览器可以控制你访问到的全局对象,同时 V8 内部仍能维护真实 global object 的结构假设。
Handle
C++ 侧不能直接长期保存裸的 V8 对象指针,因为 GC 可能移动对象,所以要通过句柄访问。
Local:短生命周期,配合HandleScope使用。Persistent:跨 C++ 调用栈保存,使用后要释放,否则容易泄漏。Traced:用于和 Chromium 的 C++ GC / cppgc 协作。
总结
Isolate 解决运行时隔离,Context 解决全局环境隔离,Handle 解决 C++ 与移动 GC 之间的引用安全问题。