我不断部署 Node.js API 服务器。尽管代码和依赖项更改很少,但随着我部署新版本的服务,正在运行的进程的内存使用量会增加。此外,尽管 Node.js (v8.12.0
) 的代码和版本完全相同且使用情况和正常运行时间相似,但相似环境中的内存使用情况并不一致。
例如,在一个较旧的环境中,API 服务器在重新启动后使用约 600MB,而在另一个较新但相同的环境中,重新启动后约使用 370MB。
为了调查内存使用情况,我使用 Chrome 开发工具拍摄了堆快照。摘要显示堆中大约有 88% 是 Strings:
查看快照中的约 900k 字符串,其中绝大多数似乎是包含旧版本 API 服务器代码的字符串:
正如底部详细信息部分中的“文件名”所示,该字符串是一个非常旧版本的源文件的完整代码。 (似乎全部)旧源文件有数百个版本。这些文件已在发布过程中从服务器中删除,但不知何故最终出现在 API 进程堆中。
我尝试使用减少的 --max-old-space-size
来启动该进程,但它会导致程序在启动时崩溃。
我无法确定先前的源代码如何/为何最终成为进程堆中的字符串。我使用指向最新版本的符号链接(symbolic link) current
目录进行部署。也许也相关的是,我使用 babel 来转译我们的源代码(曾经用于 async/await,现在用于 ES6 导入)。
为什么 Node.js 将旧源文件作为字符串添加到堆中以及如何防止这种情况发生?
最佳答案
所以这最终是由 babel 缓存引起的。仍在深入探究,但删除 api 用户主目录中不断增长的 200MB ~/.babel.json
文件似乎已经解决了问题。该服务现在使用大约 90MB 的内存运行良好。正在关注these instructions在启动应用程序时禁用缓存已经为我解决了这个问题。
关于Node.js 堆快照填充了旧版本代码的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54528030/