菜单

JavaScript VM 生命周期

相关源文件

本文档介绍了 Bun 的 JavaScript 虚拟机生命周期,包括 VM 初始化、全局对象创建、内存管理以及垃圾回收集成。VM 生命周期涵盖了 JavaScriptCore VM 实例在 Bun 运行时环境中从启动到关闭的整个生命周期。

有关协调 JavaScript 执行的事件循环的信息,请参阅 ZigGlobalObject 和事件循环。有关 VM 上下文中模块加载和解析的详细信息,请参阅 模块系统和加载

VM 初始化过程

Bun 中的 JavaScript VM 初始化遵循一个多阶段过程,该过程配置 JavaScriptCore、设置全局环境并为 JavaScript 执行准备运行时。

JSC 引擎初始化

核心 VM 初始化从 JSCInitialize 函数开始,该函数执行 JavaScriptCore 引擎的基本设置。

来源: src/bun.js/bindings/ZigGlobalObject.cpp259-325

JSC 配置选项

VM 初始化设置了针对 Bun 运行时特性优化的特定 JavaScriptCore 选项。

选项目的
useConcurrentJITtrue启用并发即时编译
useWasmtrue启用 WebAssembly 支持
useSourceProviderCachetrue缓存已解析的源代码以提高性能
exposeInternalModuleLoadertrue允许访问内部模块加载器
useSharedArrayBuffertrue启用 SharedArrayBuffer 支持
useJITtrue启用即时编译
useBBQJITtrue启用基线 JIT 编译器
useJITCagefalse禁用 JIT 代码签名限制
useShadowRealmtrue启用 ShadowRealm 提案支持

来源: src/bun.js/bindings/ZigGlobalObject.cpp286-301

全局对象创建

全局对象通过 Zig__GlobalObject__create 函数创建,该函数处理不同的执行上下文。

来源: src/bun.js/bindings/ZigGlobalObject.cpp912-976

全局对象生命周期

Zig::GlobalObject 类是 Bun 的原生代码与 JavaScriptCore 之间的主要接口,负责管理 JavaScript 执行上下文的生命周期。

GlobalObject 结构和继承

来源: src/bun.js/bindings/ZigGlobalObject.h93-127

内存管理集成

全局对象通过多种机制与 JavaScriptCore 的垃圾回收系统集成。

DOM 对象管理

来源: 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

垃圾回收集成

事件循环通过多种机制与垃圾回收协调。

GC 定时器管理

来源: src/bun.js/event_loop.zig256-260 src/bun.js/event_loop.zig441-443

微任务和 GC 协调

VM 确保微任务执行和垃圾回收之间的正确协调。

来源: src/bun.js/event_loop.zig110-123 src/bun.js/bindings/ZigGlobalObject.cpp847-858

事件循环集成

VM 生命周期与 Bun 的事件循环紧密集成,确保 JavaScript 执行与异步操作之间的协调。

VM-事件循环协调

来源: src/bun.js/event_loop.zig445-477

Promise 和微任务管理

VM 通过专用队列处理 promise 解析和微任务执行。

来源: src/bun.js/event_loop.zig145-150 src/bun.js/bindings/ZigGlobalObject.cpp838-844

VM 关闭和清理

VM 关闭过程确保资源得到妥善清理并与事件循环进行协调。

GlobalObject 析构

来源: 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