V8 堆快照分析
从 V8 堆快照定位内存泄漏与对象保留链。
技能主要读取用户指定的堆快照,并将调查脚本写入 gitignored scratchpad,未见凭据窃取、外传或破坏性默认行为;但未要求用户确认路径或说明堆快照可能包含源码、提示词和敏感数据,也未明确权限边界、清理/回滚和依赖完整性,因此扣分。
工作流结构清晰,提供大文件流式替代方案和弱引用处理;但静态检查发现 parseSnapshot.ts 从文件末尾约100字节反向寻找 strings 数组键,通常无法定位大型 strings 区段,且 scratchpad 示例的 ../helpers 相对路径可能错误。缺少针对关键路径的技能专用测试和明确异常诊断,因此仅给低分。
目标用户、输入类型和主要场景说明较清楚,也声明了超过2 GiB快照的限制;但未定义标准输出格式、更多非适用边界、触发排除条件或中文使用支持。核心功能不依赖海外服务,因此未因网络可达性额外扣分。
文档按解析、比较、保留路径和脚本编写分层,包含示例、限制、概念说明和 MIT 版权头;但没有技能版本、变更记录、独立安装/依赖说明、FAQ、维护责任或更新路径,且示例导入路径存在疑点,因此扣分。
比较、构图和保留路径分析的目标具有直接实用价值,且针对超大快照给出流式策略;但核心解析器疑似无法可靠处理 strings 区段,输出主要是 console 日志而非稳定的可消费结果,缺少静态可验证的代表性结果,因此仅部分认可。
源文件、版权信息和仓库 CI 可审计,但提供的 CI 工作流覆盖聊天性能/泄漏检查,并非该技能 helpers 的测试;没有技能专用测试、样例快照或第三方执行证据,结论主要来自静态代码检查,因此低分。
- parseSnapshot.ts 的 strings 区段定位逻辑可能在常规或大型快照上失败,建议修复并加入样例快照测试。
- scratchpad 中从子目录导入 helpers 的相对路径可能应为 ../../helpers。
- 堆快照可能包含源码、提示词、对象内容和其他敏感数据;使用前应明确授权、存储位置、保留期限和脱敏要求。
- 文档应补充稳定输出格式、失败处理、版本/变更记录、依赖安装和维护更新路径。
它能做什么 & 适用场景
这是一个用于分析 V8 `.heapsnapshot` 文件的 Agent Skill,适合调查内存泄漏、对象数量或大小变化,以及对象为何在垃圾回收后仍然存活。它提供快照解析、前后快照比较和保留路径追踪辅助工具,并支持为具体调查编写 scratchpad 脚本。该 Skill 从已经存在的快照开始,不负责启动 VS Code 或捕获快照。对于超过约 2 GiB 的快照,需要改用流式分析脚本,而不是重复读取整个文件。
读取 V8 .heapsnapshot 文件;使用 parseSnapshot.ts 解析快照并用 buildGraph 构建对象图;使用 compareSnapshots.ts 比较 before/after 快照,生成按大小、数量、新对象组和摘要组织的结果;使用 findRetainers.ts 跳过弱引用边并追踪对象的保留路径;在 .github/skills/heap-snapshot-analysis/scratchpad/ 下编写调查脚本和 findings.md;对超大文件使用 streamSnapshot.mjs 的流式原语扫描节点、边和必要的字符串。
- 开发者已经从 DevTools 或其他流程获得 before/after 快照,需要比较对象数量和大小变化。
- 排查某类对象在垃圾回收后仍存活,并需要找到实际的保留路径。
- 分析 VS Code 内存问题时,检查 RowCache、资源池、Observable、HoverService 或序列化状态等可能的保留模式。
- 面对超过约 2 GiB 的快照,需要只流式读取相关区段,避免一次性加载整个文件。
- 需要为一次性的内存调查编写可复用的分析脚本,并记录已验证、排除和延期的假设。
优缺点一览
- 覆盖解析、前后快照比较和保留路径追踪三个核心环节。
- 明确要求跳过 weak 边,降低把 WeakMap 等非强引用误判为泄漏的风险。
- 针对超过约 2 GiB 的文件提供流式分析策略,包含区段定位、元数据解析和分块读取建议。
- 提供 VS Code 常见保留模式和防御性清理注意事项,可帮助调查应用内存问题。
- 允许在 gitignored 的 dated scratchpad 子目录中保存脚本、缓存结果和调查结论。
- 只分析已经存在的快照,不负责捕获快照或复现用户操作场景。
- 普通辅助工具可能因约 2 GiB 的 Buffer 限制而无法加载超大快照,需要额外编写流式脚本。
- 流式分析需要自行决定要扫描的区段和字段,且字段级归属可能低估监听器、观察者和反向引用。
- 分析通常需要较多内存;源材料给出的示例使用 `--max-old-space-size=16384` 或更高配置。
- 源材料没有提供独立安装流程、平台矩阵或测试套件信息。
如何安装
该 Skill 位于 microsoft/vscode 仓库的 .github/skills/heap-snapshot-analysis/SKILL.md。源材料没有提供独立安装命令或单独打包说明;应将包含该路径的技能目录放入所用 Agent Skills 客户端可发现的位置。其所在仓库采用 MIT 许可证。
如何使用
先准备已有的 .heapsnapshot 文件,并向 Agent 提出例如“比较 /path/to/before.heapsnapshot 和 /path/to/after.heapsnapshot,找出新增对象组和主要保留路径”。在脚本中可导入:import { parseSnapshot, buildGraph } from '../helpers/parseSnapshot.ts';、import { compareSnapshots } from '../helpers/compareSnapshots.ts'; 或 import { findRetainerPaths } from '../helpers/findRetainers.ts';。运行 scratchpad 脚本时,源材料给出的形式是:cd .github/skills/heap-snapshot-analysis,然后使用 node --max-old-space-size=16384 scratchpad/analyze.mjs;超大文件则使用 streamSnapshot.mjs 编写流式分析脚本。若还需要启动 VS Code、驱动场景并捕获快照,应先使用 VS Code performance workflow skill。
对比同类
与 VS Code performance workflow skill 相比,本 Skill 位于后续的低层分析阶段:performance workflow 用于启动 VS Code、驱动场景并捕获快照;本 Skill 使用已存在的快照进行解析、比较和保留路径调查。两者是互补关系,而不是同一用途的替代品。