Node的内存管制

Allocation failed — process out of memory

如果您看到下面的谬误,这意味着您的 NodeJS 应用程序内存不足,它耗费的内存超过了调配的内存,最终导致它自行终止。

当应用程序批处理大量数据时,数据处理算法的编写形式使其须要保留堆空间中的对象,直到解决实现。随着解决的进行,应用程序逐步应用了更多内存,V8也将 将破费更多工夫进行垃圾收集以开释未应用的内存,直到最终达到调配给过程的限度并导致了OOM。

Node.js 运行时在内存使的用方面十分高效,因而程序通常应用默认限度运行良好。并且,如果没有被动设置最大堆大小,程序则会应用默认内存限度,并且此默认值也是会依据 Node.js 版本和程序运行的零碎架构而有所不同。

上面咱们具体理解一下:

1.1 V8的垃圾回收机制与内存限度

JavaScript与Java一样,由垃圾回收机制来进行主动的内存治理。对于性能敏感的服务器端程序,内存治理的好坏、垃圾回收情况是否低劣,都会对服务形成影响。而在Node中,这所有与V8引擎非亲非故。

1.2 V8的内存限度

网上大都说,Node中通过JavaScript只能应用局部内存(64位约1.4G,32位约0.7G)。V8对内存做了限度。因而这种限度下,将会导致Node无奈间接操作大内存对象。然而随着版本升级,这个数据如同不是那么相对。

对于限度官网也没间接阐明(次要不确定是否能通过buffer.constants.MAX_LENGTH间接类比),所以写个小程序大略在64位零碎上跑一下。

Node.js (64位实测)版本限度

表头表头
16.x4.0 GB
15.x4.0 GB
14.x4.0 GB
13 .x2.0 GB
12.x2.0 GB
11.x1.4 GB
10.x1.4 GB
9.x1.4 GB

官网文档buffer.constants.MAX_LENGTH

  • 16.x
  • 12.x
  • 11.x

1.3 解决内存不足谬误

为了解决 OOM 谬误,您须要做的就是显式配置内存限度应用 Node.js 命令行选项

-max-old-space-size=<size_megabytes>

Javascript:

node --max-old-space-size=2048 index.js #increase to 2GBnode --max-old-space-size=3072 index.js #increase to 3GBnode --max-old-space-size=4096 index.js #increase to 4GBnode --max-old-space-size=5120 index.js #increase to 5GBnode --max-old-space-size=6144 index.js #increase to 6GBnode --max-old-space-size=7168 index.js #increase to 7GBnode --max-old-space-size=8192 index.js #increase to 8GB

Typescript的ts-node

node -r ts-node/register --max-old-space-size=2048 index.tsnode -r ts-node/register --max-old-space-size=3072 index.tsnode -r ts-node/register --max-old-space-size=4096 index.ts node -r ts-node/register --max-old-space-size=5120 index.ts node -r ts-node/register --max-old-space-size=6144 index.ts node -r ts-node/register --max-old-space-size=7168 index.ts node -r ts-node/register --max-old-space-size=8192 index.ts 

这就能疾速解决 Node.js 内存不足的问题!

1.4 最佳实际

倡议始终明确设置,--max-old-space-size而不是依赖 Node.js 的默认值,因为在较新的 Node.js 版本中默认值可能会更改。

在具备 2 GB 内存的机器上,思考将其设置为 1536 (1.5 GB) 以留出一些内存用于其余用处并防止内存替换。
如果您在小型机器(例如 Raspberry Pi 板)上应用 Node.js 运行简略的 Web 服务器,您能够将 设置--max-old-space-size为适当的小值,例如 128 MB,以防止 Node.js 占用过多贵重的内存。

1.5 pm2扩大

对于pm2的具体应用请查看我的文章Node服务与pm2实战

通过咱们除了前端我的项目编译(各种cli等等)可能呈现内存不足,node服务端也可能导致此问题。前端编译咱们很简略的借助减少默认内存能够解决,然而服务端部署是一个继续过程,咱们很少应用node间接启动的形式启动服务。咱们通常借助pm2工具来进行,它能够在服务因异样或其余起因被杀掉后进行主动重启。 因为Node的单线程特色,主动重启能很大水平上的进步它的健壮性。

减少内存

pm2 start app.js --node-args="--max-old-space-size=1024"

内存溢出重启

因为咱们服务端应用pm2的目标之一,是服务出问题主动重启,而万一咱们设置的内存不足或者服务思考有余有些问题,导致服务内存不足解体对于生产环境来说很不敌对。而pm2针对内存不足也有一个重启命令,一旦内存不足,会主动重启服务,避免整个服务卡死。

根本用法

pm2 start app.js --max_memory_restart 1024M :

当内存超过1024M时主动重启。 如果工程中有比拟辣手的内存泄露问题,这个算是一个折中计划。

配置用法

pm2其实也是反对配置文件来启动的,咱们也能够借助配置文件来配置命令与参数:

pm2 startOrRestart ecosystem.json
如下是ecosystem.json的示例内容:  {    apps : [        {            name: "nova",            max_memory_restart: "1024M",            script: "app.js"        }    ] }