vscode多窗口时每个窗口独占renderer、extension host等进程,内存叠加超2gb;禁用插件需彻底退出窗口才释放内存;files.watcherexclude须按窗口单独配置,路径必须为"/node_modules/":true;语言服务器降级(如ts关自动导入、python换jedi)比关插件更有效。

怎么看多窗口真正在吃多少内存
别信任务管理器里那个“Code Helper”进程的数字——它只是壳。VSCode 多窗口时,每个窗口都对应一个独立的 Renderer 进程(界面渲染)、一个独立的 Extension Host(插件运行)和可能共用的 Search 进程。它们各自占几百 MB,加起来就破 2GB。按 Cmd+Shift+P(macOS)或 Ctrl+Shift+P(Windows/Linux),输入并执行 Developer: Open Process Explorer,才能看到每个窗口的真实内存分布。
禁用扩展后必须关掉整个窗口才生效
多窗口下禁用某个插件(比如 gitlens 或 esbenp.prettier-vscode),只对当前窗口“标记为禁用”,但旧的 Extension Host 进程仍驻留,内存不释放。这是因为插件注册了 onStartupFinished 或 onLanguage:typescript 这类事件,一旦触发就常驻。
- 先运行
Developer: Show Running Extensions,确认哪些插件在哪个窗口里还“Active” - 右键 →
Disable (For All Folders),不是仅禁用当前工作区 - 必须完全退出该窗口(macOS 要点击菜单栏图标 →
Quit Visual Studio Code),再重新打开项目 - 重载窗口(
Developer: Reload Window)没用,旧进程还在
files.watcherExclude 必须按窗口配,且路径要写对
VSCode 的文件监听是按工作区(即每个窗口)单独启动的。如果你开了三个窗口,每个都指向不同项目,那每个项目的根目录下都得有 .vscode/settings.json,且都含正确的 files.watcherExclude。漏掉任何一个,那个窗口就会默默为 node_modules 创建上万 inotify 句柄,内核级内存持续爬升,和插件无关。
- 必须写成
"**/node_modules/**": true,写成"node_modules"或"*/node_modules/*"都无效 - 必加项:
"**/dist/**": true、"**/build/**": true、"**/.git/**": true - Linux/macOS 用户还需检查
cat /proc/sys/fs/inotify/max_user_watches,低于524288就得调高,否则 watcher 会静默失败并反复重试
语言服务器降级比关插件更治本
多窗口开多个 TypeScript/Python 项目时,每个窗口都拉起一个 tsserver 或 pyright,它们默认全量加载依赖树类型信息,一个窗口轻松吃掉 600MB+。这时候禁用插件只是掩耳盗铃,换语言服务更直接。
- TypeScript:在项目级
settings.json中设"typescript.preferences.includePackageJsonAutoImports": "off" - Python:把
"python.languageServer"从Pylance改成Jedi(Jedi 不做全量语义分析) - ESLint:设
"eslint.run": "onType",并精简"eslint.probe"(例如只留["javascript", "typescript"])
这些配置必须写进每个窗口对应项目的 .vscode/settings.json,全局设置不生效。多窗口场景下,最容易被忽略的是:你以为关了一个插件,其实每个窗口都还跑着自己的副本;你以为配了一次 files.watcherExclude,其实它只管当前窗口的项目目录。











