【发布时间】:2019-06-28 21:29:21
【问题描述】:
我不断部署 Node.js API 服务器。尽管代码和依赖项更改很少,但随着我部署新版本的服务,正在运行的进程的内存使用量会增加。此外,尽管 Node.js (v8.12.0) 的代码和版本完全相同,并且使用情况和正常运行时间相似,但在相似环境中的内存使用情况并不一致。
例如,在一个较旧的环境中,API 服务器在重新启动后使用 ~600MB,而在另一个较新但相同的环境中,重新启动后约为 370MB。
为了调查内存使用情况,我使用 Chrome 开发工具拍摄了堆快照。总结显示堆中大约有88%是Strings:
查看快照中的约 900k 字符串,其中绝大多数似乎是包含旧版本 API 服务器代码的字符串:
正如底部详细信息部分中的“文件名”所示,此字符串是源文件非常旧版本的完整代码。有数百个版本(看似全部)旧源文件。这些文件在发布过程中已从服务器中删除,但不知何故最终在 API 进程堆中。
我尝试使用减少的--max-old-space-size 启动该进程,但它会导致程序在启动时崩溃。
我无法确定之前的源代码如何/为什么在进程堆中以字符串形式结束。我使用指向最新版本的符号链接的current 目录进行部署。或许也相关的是我使用 babel 转译我们的源代码(从前用于 async/await,现在用于 ES6 导入)。
为什么 Node.js 将旧的源文件作为字符串添加到堆中,我该如何防止这种情况发生?
【问题讨论】:
标签: node.js memory heap-memory