Node.js 堆快照填充了旧版本代码的字符串

标签 node.js memory heap-memory

我不断部署 Node.js API 服务器。尽管代码和依赖项更改很少,但随着我部署新版本的服务,正在运行的进程的内存使用量会增加。此外,尽管 Node.js (v8.12.0) 的代码和版本完全相同且使用情况和正常运行时间相似,但相似环境中的内存使用情况并不一致。

例如,在一个较旧的环境中,API 服务器在重新启动后使用约 600MB,而在另一个较新但相同的环境中,重新启动后约使用 370MB。

为了调查内存使用情况,我使用 Chrome 开发工具拍摄了堆快照。摘要显示堆中大约有 88% 是 Strings:

snapshot statistics

查看快照中的约 900k 字符串,其中绝大多数似乎是包含旧版本 API 服务器代码的字符串:

snapshot strings

正如底部详细信息部分中的“文件名”所示,该字符串是一个非常旧版本的源文件的完整代码。 (似乎全部)旧源文件有数百个版本。这些文件已在发布过程中从服务器中删除,但不知何故最终出现在 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/

相关文章:

c - 使用堆栈来避免动态分配是一种不好的方式吗?

javascript - 使用 Lambda 查询 DynamoDB 没有任何作用

node.js -/usr/bin/env : node --harmony: No such file or directory

c++ - 远离 Windows\C++ 中的虚拟内存

c++ - 从函数返回时指针损坏

c - 具体来说,fork() 如何处理 Linux 中 malloc() 动态分配的内存?

javascript - 在nodejs中运行Python脚本

Ajax 与 Socket.io

C++ wxWidgets Gui-App关闭后保留在内存中

jar 文件中的 Java 堆空间错误