Javascriptcore 代

其他 社区
解读按原文结构重写,命令、链接、术语均保留;右侧可核对作者原始 SKILL.md

原文结构

  • The mental model:The heap is a graph. GC does a breadth-first search from roots → marks everything it reaches → everything unmarked is freed (lazily, on next allocation from that block). It does NOT compact or move objects — pointers stay stable for an object's lifetime.
  • How the VM gathers roots:Roots are not a hardcoded list — they are marking constraints registered with Heap::addMarkingConstraint() and run to fixpoint. The built-in set lives in Heap::addCoreConstraints() (vendor/WebKit/Source/JavaScriptCore/heap/Heap.cpp:2970):
  • Object layout: the 8-byte JSCell header:Every GC-managed object inherits JSCell (runtime/JSCell.h): StructureID — compressed hidden-class pointer indexingTypeAndMisc — 2 bits are an embedded WTF::Lock (the cell lock); always CAS this byte

适用与边界

  • 当前原文没有单列适用场景。
  • gcProtect / JSValueProtect — almost never:gcProtect() / JSValueProtect() push into Heap::mprotectedValues (a ref-counted root map, visited by the Msr constraint). It's the legacy C-API mechanism. Avoid it in Bun: It's a raw global root with manual unprotect — easy to leak.

原文中的明确线索

  • 要点:「non-moving, generational, parallel, mostly-concurrent, conservative-on-the-stack」、「roots」、「Two collection modes」、「Eden GC」、「Full GC」、「It runs concurrently.」、「off the main thread, racing with your code」、「marking constraints」
  • 文件与命令visitChildrenHeap::addMarkingConstraint()Heap::addCoreConstraints()vendor/WebKit/Source/JavaScriptCore/heap/Heap.cpp:2970gatherStackRootsConservativeRootsMsrvm.smallStrings

流狐整理:以上内容来自当前 SKILL.md 的章节与原词;未补写作者没有声明的工具、兼容性或能力。

流狐档案 作者与许可取自来源;运行、权限和网络为流狐检测或估算
流狐分类
通用
作者声明 Agent
未找到明确声明;不据此推断已兼容或已测试
静态检查
88 / 100 · 启发式扫描,不代表运行安全
作者 / 版本 / 许可
@oven-sh · 未声明 license
流狐 Token 估算
中等消耗
流狐接入估算
需简单配置
是否需要外部 API Key
未发现要求
检测到的系统要求
macOS · Linux · Windows
底层运行要求
Node.js
检测到的文件与系统行为
  • 只读
  • 允许写入 / 修改
  • Shell 执行
检测到的网络行为
仅限本地
安装命令数
无(仅作为资料)

档案由构建时根据 SKILL.md 与安装命令自动衍生,可能与作者实际意图存在差异。

需要注意: 未限定 allowed-tools,默认拥有全部工具权限。

输出预览 javascriptcore-garbage-collector.preview
# visitAdditionalChildren and output constraints

// Custom hook called from BOTH places:
template<typename Visitor>
void JSFoo::visitAdditionalChildren(Visitor& visitor) {
    wrapped().listeners().visitJSEventListeners(visitor);
    visitor.addOpaqueRoot(&wrapped());
}

// 1) From visitChildren (normal marking):
DEFINE_VISIT_CHILDREN_WITH_MODIFIER(..., JSFoo) {
    ...
    thisObject->visitAdditionalChildren(visitor);
}

// 2) From visitOutputConstraints (constraint fixpoint re-scan):
template<typename Visitor>
void JSFoo::visitOutputConstraints(JSCell* cell, Visitor& visitor) {
    auto* thisObject = jsCast<JSFoo*>(cell);
    Base::visitOutputConstraints(thisObject, visitor);
    thisObject->visitAdditionalChildren(visitor);
}

讨论

基于 GitHub Discussions。登录 GitHub 即可参与讨论、点赞、订阅更新。