Allocation failed — process out of memory
如果您看到上面的错误,这意味着您的 NodeJS 应用程序内存不足,它消耗的内存超过了分配的内存,最终导致它自行终止。
当应用程序批处理大量数据时,数据处理算法的编写方式使其需要保留堆空间中的对象,直到处理完成。随着处理的进行,应用程序逐渐使用了更多内存,V8也将 将花费更多时间进行垃圾收集以释放未使用的内存,直到最终达到分配给进程的限制并导致了OOM。
Node.js 运行时在内存使的用方面非常高效,因此程序通常使用默认限制运行良好。并且,如果没有主动设置最大堆大小,程序则会使用默认内存限制,并且此默认值也是会根据 Node.js 版本和程序运行的系统架构而有所不同。
下面我们具体了解一下:
JavaScript与Java一样,由垃圾回收机制来进行自动的内存管理。对于性能敏感的服务器端程序,内存管理的好坏、垃圾回收状况是否优良,都会对服务构成影响。而在Node中,这一切与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
为了解决 OOM 错误,您需要做的就是显式配置内存限制使用 Node.js 命令行选项