Qwen Code 遇大目录 glob 触发堆 OOM:每目录缓存一份 gitignore 匹配器
XxCotHGxX · ghdev · 2026-09-18
QwenLM/qwen-code 的 issue #12151 报告:在一个仅约 3.8k 跟踪文件、但含约 53.2 万未跟踪实验输出文件的仓库里,模型执行 /something/metrics.py 这类 glob 后几分钟内即崩溃,报 JavaScript heap out of memory。
根因不在遍历本身:自 #6123 起 glob 会对进入的每个目录检查 ignore 规则,GitIgnoreParser.isIgnored() 经 getIgnorerForDir() 为每个目录新建一个 ignore() 实例,重新加入 .git、.git/info/exclude 及从根到该目录的所有 .gitignore 规则,并存入永不清理的 ignorerCache。FileDiscoveryService 整个会话常驻,于是每个目录都持有一份编译后的规则副本(外加内部路径结果缓存)。以约 45 条规则的根 .gitignore 计,约 8 KB/目录,遍历远未结束就撞上默认约 4 GB 堆上限。
直接跑 GlobTool + FileDiscoveryService(不涉及模型)、--max-old-space-size=4096、强制 GC 后测活堆:
- 0.23.3 原版:11s 646 MB,27s 1429 MB,56s 2723 MB,约 97s OOM
- 完全不加 ignore 规则:遍历中峰值 1558 MB(此时走 109 万条目,因 .venv 等未被跳过),31s 结束回落到 64 MB
- 应用修复后:遍历中峰值 727 MB,52s 完成
「编程与Agent」频道最新
- Teknium转发:一台主机跑Hermes网关分管运营与财务 — Teknium · 2026-09-18
- 组织不换决策机制,引入 AI 也难真正转型 — JoeJustice · 2026-09-18
- Anthropic 自曝:Claude 生成的代码 80% 由 Claude 自己写 — chrismattmann · 2026-09-18
- 拆解 mem0 源码:一次 SDK 调用背后藏着三道一致性边界 — Mahmoud_Zalt · 2026-09-18
- 模型总在自行填空:把判定权移出 AI 的执行门控设计 — Jay299792458 · 2026-09-18
- TypeSafe Jev 生态爆发:六大 GitHub 项目覆盖浏览器代理与自动交易 — alexcovo_eth · 2026-09-18