👁 82 次阅读
Turbopack 开发服务器内存为何暴涨到 8GB?
来源链接:https://github.com/vercel/next.js/issues/81161现象描述
这是一个在 Next.js 仓库中记录的开发服务器资源消耗问题,标签为Performance、Turbopack、linear: turbopack、locked,最终状态为 closed(关闭时间 2026-08-06,关闭原因 completed)。该问题从 2026 年 2 月持续讨论到 2026 年 9 月,累计 67 条评论,剔除机器人或无效留言后,实质讨论为 64 条。
问题报告者提供了一个最小复现仓库,仓库地址写在 issue 正文中:
https://github.com/dokugo/next-reown-appkit-memory-usage
复现步骤按原文为:
1. Clone 上述仓库
2. 安装依赖
3. 用 Turbopack 启动开发服务器:npm run dev / pnpm dev
4. 打开 http://localhost:3000
5. 依次点击导航栏链接(route 0 到 route 14)
6. 每次路由编译都会造成大幅 CPU 峰值,并给开发服务器进程增加约 400 MB
7. 开发服务器进程最终占用约 8000 MB RAM
8. 在任意路由硬刷新,每次再增加约 30 MB,可重复触发直至 OOM
报告者给出的当前行为与预期行为对照如下:
- 仅运行
npm run dev并打开 localhost,就达到约 2000 MB RAM - 访问 15 个空白路由后,开发服务器进程约 8000 MB(Webpack 下约 2500 MB)
- 每次路由编译新增约 400 MB
- 每次路由编译出现持续数秒的高 CPU 峰值
- 路由编译速度约为 Webpack 的 1/5
- HMR 占用约 5% CPU,而通常为 0.1%
- 硬刷新每次新增约 30 MB,持续增长直至 OOM
Operating System:
Platform: win32
Arch: x64
Version: Windows 11 Pro
Available memory (MB): 65144
Available CPU cores: 16
Binaries:
Node: 22.16.0
npm: 10.9.2
Yarn: N/A
pnpm: N/A
Relevant Packages:
next: 15.3.4
eslint-config-next: 15.3.4
react: 19.1.0
react-dom: 19.1.0
typescript: 5.8.3
Next.js Config:
output: N/A
背景原因
报告者提到,他在搭建 Next.js 应用时需要加入加密钱包功能,因此使用了 Reown Appkit(原 WalletConnect)。他不确定该问题是否专属于 Next.js,还是 Appkit 存在某些 Next 特有的行为干扰了 Turbopack 开发服务器。 值得注意的一点是,报告者表示以下技术栈均无法复现该行为:- Remix(React Router 7)
- Tanstack Start
- CSR React + Vite
next@canary,结果无差异。
讨论中多数用户是在不同版本上报告同类症状,随后由社区成员逐步缩小到具体机制。根据 issue 讨论,后续的定位集中在文件系统缓存相关的开发期配置上。有用户指出,RAM 增长可归因于 experimental.turbopackFileSystemCacheForDev,该配置默认值为 true(讨论中引用位置为 next/dist/server/config-shared.js:263)。用户未主动开启过该配置,却在热缓存状态下持续吃到这一增长路径。
排查或量化方法
多位用户提供了可比较的量化数据。整理如下表,便于判断不同版本与配置下的差异。| 报告者 / 版本 | 环境 | 配置要点 | 观测结果 | |
| 原始报告者,Next 15.3.4 | Windows 11 Pro,Node 22.16.0,16 核,64 GB | Turbopack 默认 | 15 个路由后约 8000 MB,每次编译 +400 MB,Webpack 约 2500 MB | |
| gabriele-ferri,Next 16.1.6 | 未在摘录中给出 | 升级后 | 开发服务器卡在 “compiling…” 且高 CPU/高内存 | |
| This-is-Prateek,Next 16.2.0 | 未在摘录中给出 | 默认 | 开始编译即出现 CPU 与内存峰值 | |
| Kerbz-dev,Next 16.2.10 | Windows 11,Node 24.13.0,16 逻辑核,32 GB,App Router monorepo | turbopack.root 指向 monorepo 根,transpilePackages 含三个 workspace 包 | 删除 .next 后跑固定请求集;500 次迭代、每次改导入组件与同级 app page,再发八次路由/图片请求,开启 NEXT_TURBOPACK_TRACING=1;单浏览器/HMR 客户端为 0.9 GB → 12 GB 私有内存,空闲 60 秒后仍有 11 GB 被保留 | |
| Kerbz-dev,Next 16.3.0-preview.6 | 隔离 worktree,无既有 .next* | experimental.turbopackMemoryEviction: "auto" | 三个浏览器/HMR 客户端 0.7 GB → 6.2 GB 峰值,空闲 60 秒后 3.4 GB;再跑两个 500 编辑批次后维持在 3.4–3.8 GB 区间,结束于空闲 3.6 GB(1500 次编辑、12000 次请求) | |
| wof-git,Next 16.2.6+ | Linux,三个 Next 应用的 monorepo | 未测试 16.3 preview | RAM 增长归因于 experimental.turbopackFileSystemCacheForDev 默认 true | |
| wof-git 给出的同提交 A/B 对照(Next 16.2.6+、Linux、三个 Next 应用的 monorepo,仅该 flag 不同)是本轮最直接的证据: | ||||
| 条件 | ready 内存 | 峰值 | node 进程数 | 结果 |
| 冷缓存(0.14 GB) | 859 MB | 1.6 GB | 5 | healthy |
| 热缓存(8.1 GB) | 4.9 GB | 21.6 GB | 166 | OOM |
热缓存 + turbopackFileSystemCacheForDev: false | 725 MB | 1.5 GB | 5 | healthy |
同一用户在 16.3.0-preview.10 上做了空闲 5 分钟的冷缓存测试:t=20s→300s 磁盘缓存增长 0 MB、可用内存反而上浮约 319 MB、无 Turbopack FATAL;但用户明确指出该测试是冷缓存、未复现热缓存 8.1 GB 的失败条件,因此不构成确认。 | ||||
量化时可参考的变量包括:turbopack.root 的位置、transpilePackages 中包的数量、是否删除活动 .next 目录、是否启用 NEXT_TURBOPACK_TRACING=1、HMR 客户端数量,以及迭代次数与每轮请求数。 | ||||
完整解决方案 | ||||
| 维护者 gaearon 在 2026-08-06 的评论中给出结论: | ||||
| > More people reporting that 16.3 fixed high memory usage with Turbopack here: https://www.reddit.com/r/nextjs/comments/1vfmycc/did_someone_check_if_memory_is_reduced_by_90/ | ||||
| > | ||||
| > I’m going to close this particular issue as solved in 16.3. If you experience high memory usage, please file a new issue with a reproducing case (agents are great at reducing your codebase into a reproducible bug report) and we’ll be sure to t… | ||||
| 据此,维护者已确认 16.3 解决了该内存占用问题,并给出修复版本号,issue 随后关闭。需要注意的是,上述 Reddit 链接指向的是一份社区观察,维护者据此表态,而非在评论中逐条列出变更记录。 | ||||
| 关于如何升到修复版本,评论区出现过如下交流: | ||||
– gaearon 在 2026-07-20 对 Kerbz-dev 的回复:Have you tried bumping to 16.3 Preview? See earlier comments on this. | ||||
– Kerbz-dev 同日回复确认已在 16.3.0-preview.6 上重跑,并加上 experimental.turbopackMemoryEviction: "auto" 做干净对比 | ||||
– baryosef-terra 同日追问:When is the release expected what is the ETA? | ||||
| 社区侧曾提出的一个可尝试配置,据 issue 讨论为关闭开发期文件系统缓存: | ||||
| ||||
此处需说明:该配置项在讨论中被指出默认值为 true,但该配置项所属的完整实现细节未在 issue 中公开,正文以讨论原文为准。 | ||||
参数或对比表格 | ||||
| 下表汇总社区报告中互相接近但并非完全一致的观测口径,避免把单一数据点当作通用基准。 | ||||
| 对比维度 | 16.2.x 及更早 | 16.3 preview / 16.3 | ||
| 空闲 5 分钟 | 观察到持续增长(wof-git) | 有用户报告增长机制似乎消失(wof-git,但为冷缓存测试,其本人强调不构成确认) | ||
| 500 次迭代负载 | 16.2.10 单 HMR 客户端 0.9 GB → 12 GB,空闲 60 秒仍保留 11 GB(Kerbz-dev) | 16.3.0-preview.6 三客户端 0.7 GB → 6.2 GB 峰值,空闲 60 秒后 3.4 GB;结束于空闲 3.6 GB(Kerbz-dev) | ||
| 维护者结论 | 未定位到单一根因 | 维护者称 “solved in 16.3”(gaearon) | ||
| 社区归因 | experimental.turbopackFileSystemCacheForDev 默认 true(wof-git) | 未见针对该项的反驳 |
常见错误排查
- 开发服务器卡在 “compiling…” 并持续高 CPU:gabriele-ferri 在 Next 16.1.6 上报告了该现象,并伴随大量 CPU 与 RAM 占用。
- 编译一开始就出现 CPU 与内存峰值:This-is-Prateek 在 Next 16.2.0 上报告了相同表现。
- 只想先绕过问题:wuguoguang 在 Next 16.1.6 上提问是否只能退回 Webpack 才能规避,并要求其它可行 workaround;该条评论下方在给出的摘录中未见明确答复。
- 在同一配置下仍不可用:wof-git 在测试
16.3.0-preview.10后明确写出,空闲增长机制看似消失,但这是冷缓存测试,并不复现此前失败的条件,因此不应将其当作确认。 - 排查时口径不一致:Kerbz-dev 特别说明使用了隔离 worktree,确保
turbopack.root下没有既有.next*目录,并开启NEXT_TURBOPACK_TRACING=1;缺少这些前置条件时,对比数值可能不可比。
实践建议
- 升级到 16.3 及以上版本,这是在 issue 中获得维护者认可的处理方向。在
16.3.0-preview.6上做重测的用户同时使用了experimental.turbopackMemoryEviction: "auto",可作为对照实验的一部分。 - 若仍在 16.2.x 上,据 issue 讨论可关注
experimental.turbopackFileSystemCacheForDev,有用户将其列为 RAM 增长的可归因项,并指出默认值为true。同一用户在16.3.0-preview.10中核对该默认值仍未改变(引用位置next/dist/server/config-shared.js:283),即未显式关闭的用户在新版本上仍默认吃到该配置。 - 若遇到进程数暴涨形态的故障,注意该故障表现为 worker 进程风暴:一旦缓存变大,PostCSS worker 拿不到所需内存即 SIGABRT,随后被逐请求无退避地重建,12 秒内可从 4 个进程涨到 166 个。这类症状在应用侧表现为接口返回 500,容易误判为凭据提供方限流。
- monorepo 场景需要显式关注
turbopack.root与transpilePackages的组合。Kerbz-dev 的报告正是围绕 monorepo 根目录下的turbopack.root与三个transpilePackages工作区包展开的。 - 做前后对比时,删除活动
.next目录,并在隔离环境里运行,避免旧缓存画像污染结论。wof-git 也提醒冷缓存测试不等于复现原失败条件。 - 报告者所用的最小复现仓库仍可作为对照样本:
https://github.com/dokugo/next-reown-appkit-memory-usage,配合依次访问 route 0 到 route 14 的路径,能较快看出单次编译的内存增量。 - 若升级后仍遇到高内存占用,按维护者要求提交带复现案例的新 issue。
FAQ
Q:这个 issue 最终算修好了吗? A:维护者 gaearon 在 2026-08-06 的评论中写明 “I’m going to close this particular issue as solved in 16.3”,关闭原因为 completed,同时 16.3 的修复结论被其引用为多人报告。据此,维护者已确认复现并给出修复版本,issue 随后关闭。 Q:升级到 16.3 之后就能确定解决吗? A:一位在16.3.0-preview.10 上重测的用户表示空闲增长机制看似消失,但明确强调那是冷缓存测试,并未复现此前失败的条件,因此不应将其视为确认。判断是否解决仍建议以自己的复现路径重跑。
Q:16.2.x 上有可先将就的配置吗?
A:据 issue 讨论,有用户将 RAM 增长归因于默认 true 的 experimental.turbopackFileSystemCacheForDev。该配置所属功能的具体实现尚未在 issue 中公开,是否生效需以自身复现结果为准。
Q:为什么只在 Next.js 上出现?
A:报告者表示在 Remix(React Router 7)、Tanstack Start、CSR React + Vite 上都无法复现,也试过 next@canary 无差异。他本人也不确定是否与 Appkit 的 Next 特有行为有关,该疑问在 issue 中没有得到直接回答。
Q:还有人在新版本上报告复现吗?
A:有。gabriele-ferri 在 2026-03-18 报告 Next 16.1.6 卡在 “compiling…”;wuguoguang 在 2026-03-20 报告 v16.1.6;This-is-Prateek 在 2026-03-26 报告 v16.2.0。这些均发生在 16.3 表态之前,之后 Kerbz-dev 与 wof-git 分别在 16.3 preview 上做了重测。
🔗 相关阅读(你可能还想看)
📄 Outlook 节点创建草稿添加附件为何报 UnableToDeserializePostBody?
📄 Flowise 点击市场或聊天页为何整页白屏?
📄 如何解决 Azure AI Search 向量存储的 $filter 递归深度超限错误?
📄 如何解决 shadcn/ui Sidebar 与 Header 重叠的问题?
📄 Next.js 开发服务器为何会 JavaScript heap out of memory?
📄 Nuxt 偶发 Cannot read properties of undefined 报错是怎么回事
📄 如何解决「Visual Studio Code for ipad」相关的问题?
📄 如何在AutoGen中实现企业级代理治理的加密行动收据(AAR)?
📄 记忆内容未清洗直接注入系统提示词,如何防范间接提示注入?
crewAI LiteAgent 将记忆内容直接拼接到系统提示词,存在间接提示注入风险。社区提出分层防御方案,但 iss