Skip to content

fix: 修复长时间使用导致的内存泄露与崩溃问题 - #453

Open
J3n5en wants to merge 2 commits into
mainfrom
fix/memory-leaks
Open

fix: 修复长时间使用导致的内存泄露与崩溃问题#453
J3n5en wants to merge 2 commits into
mainfrom
fix/memory-leaks

Conversation

@J3n5en

@J3n5en J3n5en commented Aug 12, 2026

Copy link
Copy Markdown
Owner

Summary

修复用户反馈的「长时间使用后内存持续增长、最终崩溃」问题。经排查,主因是渲染进程多处无界内存增长导致 OOM,PTY 原生层此前已有较完善防护。

渲染进程(OOM 主因)

  • Monaco model 泄露DiffViewer 的 commit diff 清理逻辑写在 onMount 返回值里(库不会调用,属死代码),且 keepCurrent* 关闭了库的默认释放——浏览提交历史时每个文件 diff 永久泄露 2 个 model;EditorArea 关闭 tab 从不 dispose model。两处均已改为正确的生命周期释放
  • 编辑器全文缓存:切换 worktree 时卸载非 dirty tab 的内容,切回按需从磁盘重读
  • Store 清理缺口:删除 worktree 现在会关闭会话并清理 sessions/tasks/activity/diffStats(含 localStorage 持久化残留);agentTasks 辅助记录随会话集合自动收敛;agentStatus 加上限(全局 hook 会收到任意 Claude 会话的状态)
  • 定时器/监听器useXterm 的 flush 定时器与 compositionend 监听器成对清理,防止写入已 dispose 的终端;AgentTerminalMergeEditor 等补齐
  • useSharedFileWatch 顺带修复同目录多订阅者只有第一个能收到事件的 bug

主进程

  • Claude IDE Bridge:dispose 时终止已连接的 WebSocket;/agent-hook/status-line 请求体加 1MB 上限;节流 Map 加 TTL
  • Windows PTY 激活前缓冲、execInPty/code review 输出缓冲加上限
  • gitServices/worktreeServices 改为 LRU;GitAutoFetch/AutoUpdater 孤儿定时器收口;窗口关闭时释放 BrowserWindow 引用
  • FileWatcher 防重入

崩溃观测(新增)

  • render-process-gone / child-process-gone 写入日志(可区分 oom 与原生崩溃),渲染进程崩溃后自动 reload(10 秒防循环)
  • crashReporter 保留本地 minidump

其他

  • Todo store 随仓库移除清理内存缓存;源码控制展开状态按 worktree/子模块隔离

Test plan

  • pnpm typecheck 通过
  • pnpm test 与 main 基线一致(8 个既有失败均为 macOS 上运行 Windows 路径断言,与本次改动无关)
  • 改动文件 biome 检查零错误
  • 手动回归:多 worktree 打开/关闭文件与 commit diff,观察 monaco.editor.getModels() 数量不再单调增长
  • 手动回归:删除 worktree 后会话/任务面板无残留,重启后不再恢复已删 worktree 的会话
  • 长时间使用后内存曲线对比(Activity Monitor / 任务管理器)

Made with Cursor

J3n5en and others added 2 commits August 12, 2026 20:24
- Monaco: 关闭 tab / commit diff 重挂载时正确 dispose model
- 编辑器切换 worktree 时卸载非 dirty 内容,切回按需重读
- 删除 worktree 时清理会话/活动/任务等 store 及持久化残留
- xterm/AgentTerminal 定时器与监听器成对清理
- Claude Bridge 关闭时终止 WS 连接,请求体与缓存加上限
- Windows PTY 激活前缓冲、CLI 输出缓冲加上限
- gitServices/worktreeServices 改为 LRU,释放关闭窗口的引用
- 新增崩溃观测:render/child-process-gone 日志与本地 minidump

Co-authored-by: Cursor <cursoragent@cursor.com>
- Todo store 新增 unloadRepo,仓库从工作区移除时释放内存缓存
- expandedFolders 按 worktree/子模块分桶存储,互不干扰
- 删除 worktree / 临时工作区时同步清理对应展开状态

Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

github-actions Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Claude encountered an error after 1s —— View job


I'll analyze this and get back to you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant