本文档介绍了 Bun 的 JavaScript 虚拟机生命周期,包括 VM 初始化、全局对象创建、内存管理以及垃圾回收集成。VM 生命周期涵盖了 JavaScriptCore VM 实例在 Bun 运行时环境中从启动到关闭的整个生命周期。
有关协调 JavaScript 执行的事件循环的信息,请参阅 ZigGlobalObject 和事件循环。有关 VM 上下文中模块加载和解析的详细信息,请参阅 模块系统和加载。
Bun 中的 JavaScript VM 初始化遵循一个多阶段过程,该过程配置 JavaScriptCore、设置全局环境并为 JavaScript 执行准备运行时。
核心 VM 初始化从 JSCInitialize 函数开始,该函数执行 JavaScriptCore 引擎的基本设置。
来源: src/bun.js/bindings/ZigGlobalObject.cpp259-325
VM 初始化设置了针对 Bun 运行时特性优化的特定 JavaScriptCore 选项。
| 选项 | 值 | 目的 |
|---|---|---|
useConcurrentJIT | true | 启用并发即时编译 |
useWasm | true | 启用 WebAssembly 支持 |
useSourceProviderCache | true | 缓存已解析的源代码以提高性能 |
exposeInternalModuleLoader | true | 允许访问内部模块加载器 |
useSharedArrayBuffer | true | 启用 SharedArrayBuffer 支持 |
useJIT | true | 启用即时编译 |
useBBQJIT | true | 启用基线 JIT 编译器 |
useJITCage | false | 禁用 JIT 代码签名限制 |
useShadowRealm | true | 启用 ShadowRealm 提案支持 |
来源: src/bun.js/bindings/ZigGlobalObject.cpp286-301
全局对象通过 Zig__GlobalObject__create 函数创建,该函数处理不同的执行上下文。
来源: src/bun.js/bindings/ZigGlobalObject.cpp912-976
Zig::GlobalObject 类是 Bun 的原生代码与 JavaScriptCore 之间的主要接口,负责管理 JavaScript 执行上下文的生命周期。
来源: src/bun.js/bindings/ZigGlobalObject.h93-127
全局对象通过多种机制与 JavaScriptCore 的垃圾回收系统集成。
来源: src/bun.js/bindings/ZigGlobalObject.h88-89 src/bun.js/bindings/ZigGlobalObject.h130-142
VM 使用独立的子空间来管理不同的对象类型,以优化垃圾回收。
来源: src/bun.js/bindings/webcore/DOMIsoSubspaces.h18-72 src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h18-76
Bun 的 VM 与 JavaScriptCore 的垃圾回收系统紧密集成,并添加了自己的内存管理优化。
VM 根据执行上下文支持不同的堆配置。
来源: src/bun.js/bindings/ZigGlobalObject.cpp926-943
事件循环通过多种机制与垃圾回收协调。
来源: src/bun.js/event_loop.zig256-260 src/bun.js/event_loop.zig441-443
VM 确保微任务执行和垃圾回收之间的正确协调。
来源: src/bun.js/event_loop.zig110-123 src/bun.js/bindings/ZigGlobalObject.cpp847-858
VM 生命周期与 Bun 的事件循环紧密集成,确保 JavaScript 执行与异步操作之间的协调。
来源: src/bun.js/event_loop.zig445-477
VM 通过专用队列处理 promise 解析和微任务执行。
来源: src/bun.js/event_loop.zig145-150 src/bun.js/bindings/ZigGlobalObject.cpp838-844
VM 关闭过程确保资源得到妥善清理并与事件循环进行协调。
来源: src/bun.js/bindings/ZigGlobalObject.h100-103 src/bun.js/bindings/ZigGlobalObject.h117-118
关闭过程协调各种子系统以确保干净终止。
| 组件 | 清理操作 | 时间点 |
|---|---|---|
| 事件循环 | 停止处理任务 | 在 VM 关闭之前 |
| 微任务队列 | 清空剩余任务 | 关闭期间 |
| DOM 对象 | 清除受保护对象集 | 关闭早期 |
| 结构 | 释放缓存的结构 | 关闭中期 |
| VM 实例 | 调用 JSC 销毁 | 最后一步 |
来源: src/bun.js/bindings/ZigGlobalObject.h185 src/bun.js/bindings/ZigGlobalObject.cpp863-865