6. 优化与安全特性
这一章只保留中常被问到的几个点:指针压缩、Sandbox、快照、IC。
指针压缩
64 位系统里,一个指针通常占 8 字节。JS 对象里有大量引用,如果全部用 64 位指针,内存和缓存压力都很大。
V8 的指针压缩思路是:堆内对象引用只存 32 位偏移,再通过一个基地址还原成真实地址。
优点:
- 降低堆内存占用。
- 提高缓存命中率。
代价:
- 对地址空间布局有要求。
- 指针解压和沙箱安全策略会增加实现复杂度。
V8 Sandbox
V8 Sandbox 的目标是缩小内存破坏漏洞的影响范围。大致思路是把 JS 可操作的对象限制在沙箱地址空间内,敏感元数据通过间接表或可信区域管理。
中可以这样说:Sandbox 不是防止所有漏洞,而是让漏洞更难突破到进程内任意内存。
启动快照
V8 启动时需要初始化内建对象、内建函数和运行时环境。每次都从头构建会慢。
Snapshot 会把初始化后的状态序列化下来,启动时直接加载,从而减少冷启动成本。Chrome 和 Node 都会利用这类机制加速启动。
IC 与反馈向量
IC 是 Inline Cache,用来记录属性访问、函数调用等位置的运行时反馈。
例如同一个属性读取总是命中相同对象形状,V8 就能生成更快路径。若对象形状变多,IC 会从单态变成多态甚至更泛化,优化效果下降。
这些反馈会影响 Maglev / Turbofan 是否优化,以及优化代码是否需要 deopt。
总结
V8 的优化不只在 JIT。指针压缩降低内存,Sandbox 提高安全边界,Snapshot 加快启动,IC 和反馈向量驱动运行时优化。