Node'smemorycontrol分配失败——进程内存不足.当应用程序批处理大量数据时,数据处理算法的编写方式需要将对象保留在堆空间中,直到处理完成。随着处理的进行和应用程序逐渐使用更多的内存,V8也会花费更多的时间进行垃圾收集以释放未使用的内存,直到它最终达到分配给进程的限制并导致OOM。Node.js运行时在内存使用方面非常高效,因此程序通常在默认限制下运行良好。另外,如果没有主动设置最大堆大小,程序会使用默认的内存限制,这个默认值也会根据Node.js版本和程序运行的系统架构而有所不同。下面我们详细看一下:1.1V8的垃圾回收机制和内存限制JavaScript和Java一样,使用垃圾回收机制进行内存的自动管理。对于性能敏感的服务端程序,内存管理好不好,垃圾回收好不好,都会影响到服务。在Node中,这一切都与V8引擎息息相关。1.2V8的内存限制网上大部分人说JavaScript只能使用Node中的部分内存(64位约1.4G,32位约0.7G)。V8对内存施加了限制。因此,在这种限制下,Node无法直接操作大内存对象。但是随着版本的升级,这个数据似乎也不是那么绝对了。官方没有关于limit的说法(主要是不确定是否可以通过buffer.constants.MAX_LENGTH直接比较),所以写个小程序在64位系统上运行。Node.js(64位实测)版本限制headerheader16.x4.0GB15.x4.0GB14.x4.0GB13.x2.0GB12.x2.0GB11.x1.4GB10.x1.4GB9.x1.4GB官方文档buffer.constants.MAX_LENGTH16.x12.x11.x1.3解决内存不足错误要解决OOM错误,您需要做的就是使用Node.js命令行显式配置内存限制选项-max-old-space-size=Javascript:node--max-old-space-size=2048index.js#increaseto2GBnode--max-old-space-size=3072index.js#increaseto3GBnode--max-old-space-size=4096index.js#increaseto4GBnode--max-old-space-size=5120index.js#increaseto5GBnode--max-old-space-size=6144索引.js#increaseto6GBnode--max-old-space-size=7168index.js#increaseto7GBnode--max-old-space-size=8192index.js#increaseto8GBTypescript的ts-node:node-rts-节点/寄存器--max-old-space-size=2048index.tsnode-rts-node/register--max-old-space-size=3072index.tsnode-rts-node/register--max-old-space-size=4096index.tsnode-rts-node/register--max-old-space-size=5120index.tsnode-rts-node/register--max-old-space-size=6144指数.tsnode-rts-node/register--max-old-space-size=7168index.tsnode-rts-node/register--max-old-space-size=8192index.ts解决问题Node.js内存不足!1.4最佳实践建议始终明确设置,--max-old-space-size而不是依赖Node.js默认值,因为在具有2GB内存的机器上较新的Node.js版本中默认值可能会发生变化,请考虑将其设置为1536(1.5GB)以释放一些内存用于其他用途并避免内存交换。如果您在小型机器(例如RaspberryPi板)上运行带有Node.js的简单Web服务器,您可以将--max-old-space-size设置为一个合适的小值,例如128MB,以避免Node.js占用太多宝贵的内存。1.5pm2extensionpm2的具体使用可以参考我的文章Node服务和pm2实战通过我们,除了前端项目编译(各种cli等),可能内存不足,nodeserver也可能导致这个问题。前端编译只要增加默认内存就可以解决,但是服务端部署是一个持续的过程,我们很少使用node直接启动服务。我们平时使用的是pm2工具,它可以在服务异常或者其他原因杀掉后自动重启。由于Node的单线程特性,自动重启可以大大提高其健壮性。增加内存pm2startapp.js--node-args="--max-old-space-size=1024"内存溢出重启因为我们服务器使用pm2的目的之一就是出现问题自动重启服务我们设置的内存不足或者服务考虑不够有一些问题,导致服务因为内存不足而崩溃,这对生产环境是很不友好的。而且pm2还有内存不足的重启命令。一旦内存不足,服务会自动重启,防止整个服务卡死。基本用法pm2startapp.js--max_memory_restart1024M:内存超过1024M时自动重启。如果项目中存在比较棘手的内存泄漏问题,这是一个折衷方案。配置使用pm2其实是支持配置文件启动的,我们也可以使用配置文件来配置命令和参数:pm2startOrRestartecosystem.json以下是ecosystem.json的例子:{apps:[{name:"nova",max_memory_restart:"1024M",脚本:"app.js"}]}