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

Node.js堆快照填充了旧版本代码的字符串,node.js,memory,heap-memory,Node.js,Memory,Heap Memory,我不断地部署Node.js API服务器。尽管代码和依赖项的更改很少,但随着我部署新版本的服务,正在运行的进程的内存使用会增加。此外,尽管Node.js的代码和版本完全相同(v8.12.0),并且使用率和正常运行时间相似,但类似环境中的内存使用率并不一致 例如,在一个较旧的环境中,API服务器在重启后使用约600MB,而在另一个较年轻但相同的环境中,API服务器在重启后使用约370MB 为了调查内存使用情况,我使用Chrome开发工具拍摄了一个堆快照。摘要显示堆中大约有88%的字符串: 查看快

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

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

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

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

正如底部细节部分显示的“文件名”,这个字符串是源文件非常旧版本的完整代码。有数百个版本(似乎全部)的旧源文件。在发布过程中,这些文件已从服务器中删除,但最终以某种方式进入API进程堆

我试图用减少的
--最大旧空间大小
启动进程,这会导致程序在启动时崩溃

我无法确定以前的源代码在进程堆中以字符串形式结束的方式/原因。我使用指向最新版本的符号链接
当前
目录进行部署。也许还有一点与此相关,那就是我使用babel来传输我们的源代码(以前用于async/await,现在用于ES6导入)


为什么Node.js会将旧的源文件作为字符串添加到堆中,以及如何防止这种情况发生?

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


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

因此这最终是由babel缓存造成的。尽管仍在追根究底,但删除api用户主目录中不断增长的200MB
~/.babel.json
文件似乎已经解决了这个问题。这项服务现在正在使用大约90MB的内存愉快地运行。以下在启动应用程序时禁用缓存的方法为我解决了这个问题。

我刚刚尝试完全删除符号链接,并直接使用完整版本目录路径进行部署。这似乎并没有对进程的内存使用产生影响:仍然有大约600MB(没有执行另一个堆快照)。