用途:诊断 Qwen Code Node.js CLI 的内存泄漏,通过采集堆快照并用 chrome-devtools CLI 分析对象保留大小,排查高内存占用与无界增长。
前置条件:需安装 chrome-devtools CLI(来自 chrome-devtools-mcp 包),未找到时经用户确认后执行 npm i chrome-devtools-mcp@latest -g;需 Node.js 22+ 以支持 --heapsnapshot-signal。
主要步骤:
- 带快照信号启动 CLI。借助 tmux 交互,使用 tmux-real-user-testing 辅助脚本启动,设置 QWEN_CODE_NO_RELAUNCH=true 与 NODE_OPTIONS=--heapsnapshot-signal=SIGUSR2,运行 npm run dev;脚本会导出 SESSION 与 OUTDIR,注意 shell 环境不跨工具调用保留,需显式保存会话名。用 find-leaf-node.sh 找到最内层 node 进程 PID。若分析生产包,先 npm run bundle,再以 node --heapsnapshot-signal=SIGUSR2 dist/cli.js 启动。
- 复现疑似泄漏:通过 tmux 驱动 TUI,间隔发送 kill -USR2 $NODE_PID 采集基线、活动后与确认趋势的多份快照,快照以 Heap.<timestamp>.<pid>.<seq>.heapsnapshot 写入工作目录。
- 启动 chrome-devtools start --experimentalMemory --headless --no-usage-statistics,以文件分析模式运行,无需浏览器或实时连接。
- 定位泄漏:用 load_memory_snapshot 加载并汇总;用 get_memory_snapshot_details 获取类级聚合(CSV:uid、className、count、selfSize、maxRetainedSize),跨快照比较找出无界增长的类;用 get_nodes_by_class 查看实例;用 get_node_retainers 追踪保留链。
- 判断根因:常见模式包括无界缓冲/数组、事件监听泄漏、闭包捕获、模块级缓存。
- 验证修复:npm run bundle 重建后重复步骤 1-4,确认泄漏类计数稳定。
清理:用辅助脚本 finish 结束会话,chrome-devtools stop,必要时删除 *.heapsnapshot。示例见 examples/react-reconciler-performance-measure-leak.md。