Turbopack 开发服务器内存为何暴涨到 8GB?

👁 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.4Windows 11 Pro,Node 22.16.0,16 核,64 GBTurbopack 默认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.10Windows 11,Node 24.13.0,16 逻辑核,32 GB,App Router monorepoturbopack.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 previewRAM 增长归因于 experimental.turbopackFileSystemCacheForDev 默认 true
wof-git 给出的同提交 A/B 对照(Next 16.2.6+、Linux、三个 Next 应用的 monorepo,仅该 flag 不同)是本轮最直接的证据:
条件ready 内存峰值node 进程数结果
冷缓存(0.14 GB)859 MB1.6 GB5healthy
热缓存(8.1 GB)4.9 GB21.6 GB166OOM
热缓存 + turbopackFileSystemCacheForDev: false725 MB1.5 GB5healthy
同一用户在 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 讨论为关闭开发期文件系统缓存:
{
  "experimental": {
    "turbopackFileSystemCacheForDev": false
  }
}
此处需说明:该配置项在讨论中被指出默认值为 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 上做了重测。

订阅 AI 百事知

每周精选 AI 工具评测、行业资讯与使用教程,第一时间送达。

🔗 相关阅读(你可能还想看)

📄 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
🤖 想直接和 AI 对话?
免费体验 DeepSeek V4 等顶级模型,无需注册,随问随答
🎯 立即体验 AI 工具

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

🤖 嘟嘟客服
滚动至顶部
🤖 嘟嘟客服
🤖 嘟嘟客服
';i.value='';m.innerHTML+='
...
';fetch('/dify-chat',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({query:q,user:'w'+Date.now()})}).then(function(r){return r.json()}).then(function(d){var a=d.answer||'暂时无法回复';m.removeChild(m.lastChild);m.innerHTML+='
'+a+'
'}).catch(function(){m.removeChild(m.lastChild);m.innerHTML+='
网络异常
'})">发送