【问题标题】:Node.js heap snapshot filled with strings of old versions of codeNode.js 堆快照充满了旧版本代码的字符串
【发布时间】: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


    【解决方案1】:

    所以这最终是由 babel 缓存引起的。仍在深入了解它,但删除 api 用户主目录中一直在增长的 200MB ~/.babel.json 文件似乎已经解决了这个问题。该服务现在可以使用大约 90MB 的内存愉快地运行。按照these instructions在启动应用程序时禁用缓存已经为我解决了。

    【讨论】:

      【解决方案2】:

      我不知道 nodejs 内部是如何工作的。但是,节点的缓存可能会以某种方式解析符号链接并存储旧脚本。

      您是否尝试过从它们所在的位置移动/删除旧版本?

      【讨论】:

      • 我刚刚尝试完全删除符号链接并使用完整的发布目录路径直接部署。它似乎对进程的内存使用没有影响:仍然大约 600MB(没有执行另一个堆快照)。
      猜你喜欢
      • 2012-03-10
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      相关资源
      最近更新 更多