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.x | 4.0 GB |
15.x | 4.0 GB |
14.x | 4.0 GB |
13 .x | 2.0 GB |
12.x | 2.0 GB |
11.x | 1.4 GB |
10.x | 1.4 GB |
9.x | 1.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 2GB
node --max-old-space-size=3072 index.js #increase to 3GB
node --max-old-space-size=4096 index.js #increase to 4GB
node --max-old-space-size=5120 index.js #increase to 5GB
node --max-old-space-size=6144 index.js #increase to 6GB
node --max-old-space-size=7168 index.js #increase to 7GB
node --max-old-space-size=8192 index.js #increase to 8GB
Typescript 的ts-node
:
node -r ts-node/register --max-old-space-size=2048 index.ts
node -r ts-node/register --max-old-space-size=3072 index.ts
node -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"
}
]
}