Claude Code 内存泄漏?一行命令救你的 MacBook
TL;DR: 我写了一个开源工具来解决这个问题 → claude-code-cleanup。如果你想先理解 Claude Code 的记忆与上下文机制,再回来处理性能问题,可以先读《Claude Code 的记忆进化:Auto Memory 与 PreCompact Hook 完全解析》和《Claude Code 记忆系统全解析:6 层记忆架构、@import 语法与 Rules 模块化》。
最近用 Claude Code 和 Codex CLI 的时候,发现一个问题:MacBook 越用越卡,风扇狂转。
打开活动监视器一看,十几个 claude 进程在后台跑,每个占用 60-170MB 内存。有的用户甚至累积到了 30GB。
这不是我的个例。去 GitHub Issues 一查,发现这是个已知的、官方尚未修复的 Bug。
问题有多严重?
我在 Claude Code 和 Codex CLI 的官方仓库里找到了大量相关 Issue:
Claude Code:
#19433—/exit命令不能终止子进程,导致孤儿进程累积#20369— 子代理进程不清理,累积 30GB 内存#11377— 进程消耗 23GB RAM,143% CPU#4953— 进程增长到 120GB+,被 OOM killer 杀死#18859— 空闲 18 小时后每个会话累积约 15GB 内存
Codex CLI:
#7932— 后台进程泄漏,Esc 退出后进程继续运行#9345— 严重内存泄漏
这些 Issue 目前都是 Open 状态。官方还没给出完整的修复方案。

根本原因
问题出在子进程管理上:
主 Claude/Codex 进程(被 /exit 或关闭终端终止)
├── 子进程 1(未收到终止信号 → 变成孤儿)
├── 子进程 2(未收到终止信号 → 变成孤儿)
└── 子进程 N(累积... 每个 60-170MB)
当你关闭 Claude Code 或 Codex CLI 时,主进程终止了,但它的子进程没有被正确清理。这些孤儿进程的父进程 ID (PPID) 变成 1,继续在后台运行、占用内存。

解决方案
既然官方还没修,我们就自己动手。
我写了一个完整的清理工具,开源在 GitHub:claude-code-cleanup
包含:
ccclean.sh— 带交互式界面的完整清理脚本- Claude Code Skill — 支持
/ccclean命令
下面是几种不同复杂度的解决方案。

方案 1:手动清理(立即见效)
# 查看有多少孤儿 Claude 进程
ps aux | grep '[c]laude' | awk '$7 == "??" {print $2}' | wc -l
# 杀死所有孤儿进程
ps aux | grep '[c]laude' | awk '$7 == "??" {print $2}' | xargs kill -9 2>/dev/null
# 或者简单粗暴:杀死所有 Claude 相关进程
pkill -f claude
# Codex CLI 同理
pkill -f codex
方案 2:添加快捷命令
在 ~/.zshrc 或 ~/.bashrc 中添加:
alias claude-cleanup='ps aux | grep "[c]laude" | awk "\$7 == \"??\" {print \$2}" | xargs kill -9 2>/dev/null && echo "✅ Claude 孤儿进程已清理"'
之后只需运行 claude-cleanup 即可。
方案 3:自动定时清理
如果你经常忘记手动清理,可以设置一个每小时自动执行的守护程序:
cat > ~/Library/LaunchAgents/com.user.claude-cleanup.plist << 'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.claude-cleanup</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>ps aux | grep '[c]laude' | awk '$7 == "??" {print $2}' | xargs kill -9 2>/dev/null || true</string>
</array>
<key>StartInterval</key>
<integer>3600</integer>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
PLIST
# 加载守护程序
launchctl load ~/Library/LaunchAgents/com.user.claude-cleanup.plist
管理命令:
# 查看状态
launchctl list | grep claude-cleanup
# 手动触发一次清理
launchctl start com.user.claude-cleanup
# 不想用了?卸载它
launchctl unload ~/Library/LaunchAgents/com.user.claude-cleanup.plist
rm ~/Library/LaunchAgents/com.user.claude-cleanup.plist
方案 4:完整清理脚本(推荐)
如果你想要更安全、更完整的解决方案,可以使用我写的 ccclean.sh 脚本:
# 下载
curl -O https://raw.githubusercontent.com/YuancFeng/claude-code-cleanup/main/ccclean.sh
chmod +x ccclean.sh
# 运行
./ccclean.sh
这个脚本的安全特性:
- 精确匹配:只清理进程名完全为
claude的进程,不会误杀其他程序 - PID 复用保护:清理前验证进程启动时间,防止误杀新进程
- 运行时长保护:跳过运行少于 5 分钟的进程
- 双重确认:列出所有候选进程,让你选择后再次确认
- 优雅终止:先发送 SIGTERM,等待后才发送 SIGKILL
日常使用建议
在官方修复之前,这些习惯可以帮你减少问题:
| 建议 | 说明 |
|---|---|
| 每 30-45 分钟重启一次 | 设个定时器,避免内存无限累积 |
多用 /clear 命令 | 清理上下文,减少内存占用 |
关闭时用 /exit | 虽然也有问题,但比直接关终端好一点 |
| 避免长时间空闲 | 空闲会话也会泄漏内存 |

总结
| 问题 | 答案 |
|---|---|
| 这是已知问题吗? | 是,官方 GitHub 有大量相关 Issue |
| 官方修复了吗? | 尚未完全修复 |
| 有解决方案吗? | 有,见上面的手动/自动清理方法 |
Claude Code 是个很强的工具,但这个内存泄漏问题确实影响体验。希望官方能尽快修复。
在此之前,claude-cleanup 命令就是你的好朋友。
开源工具
我把完整的解决方案开源在了 GitHub:
包含两个工具:
ccclean.sh— 独立的 bash 脚本,带交互式界面,可以直接下载运行- Claude Code Skill — 如果你也在用 Claude Code,可以把
skill/SKILL.md复制到你的 skills 目录,然后直接用/ccclean命令清理
欢迎 Star 和提 Issue。
常见问题解答
Claude Code 内存占用居高不下、耗尽 RAM 的主要原因是什么?
主要原因是孤儿进程。用 /exit 退出或直接关闭终端时,Claude Code 的主进程结束了,但它启动的子进程(例如子代理进程)没有收到终止信号,父进程 ID(PPID)变成 1,继续在后台运行并占用内存,每个约 60–170MB,会话开得越多积得越多。GitHub Issues 里有用户报告子代理进程未清理、累积到 30GB(#20369);长时间运行或空闲的会话本身也会持续增长,有报告称空闲 18 小时后每个会话累积约 15GB(#18859)。Codex CLI 也有类似的后台进程泄漏(#7932)。截至 2026 年 1 月本文发布时,这些 Issue 仍处于 Open 状态。
如何快速定位并一键清理残留的 Claude Code 孤儿进程?
先用 ps 找出没有控制终端(TTY 为 ??)的 claude 进程:ps aux | grep '[c]laude' | awk '$7 == "??" {print $2}' | wc -l 会返回数量,把末尾的 wc -l 换成 xargs kill -9 即可一次性清理。注意 TTY 为 ?? 只说明进程没有终端,不一定是孤儿,后台仍在工作的会话也会被一起结束,执行前先确认。更稳妥的做法是运行开源脚本 ccclean.sh(GitHub:YuancFeng/claude-code-cleanup):它只匹配进程名恰好为 claude 的进程,跳过运行不足 5 分钟的进程,列出候选并二次确认后先发 SIGTERM、再发 SIGKILL;Claude Code 用户也可以安装仓库里的 Skill,直接运行 /ccclean。
如何在日常使用中防止长会话导致的上下文膨胀与资源泄漏?
核心是不让单个会话无限拉长。按任务拆分会话:一个任务完成就用 /clear 清空上下文,或用 /exit 退出后重新开始,连续使用 30–45 分钟左右主动重启一次;不要让会话长时间空闲挂着,退出时用 /exit,而不是直接关闭终端。担心 /clear 或重开会话丢失项目背景,可以把长期信息写进 CLAUDE.md,或交给 Auto Memory 自动记录:它把项目约定和调试心得记在 MEMORY.md,每次新会话开始时自动加载前 200 行。最后再用 launchd 设置每小时自动清理一次孤儿进程,作为兜底。
如果这篇文章对你有帮助,欢迎请我喝杯咖啡,支持我继续创作更多内容。
Buy me a coffee