美文网首页
Node的内存控制

Node的内存控制

作者: DLLCNX | 来源:发表于2022-02-28 16:43 被阅读0次

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


    title
  • 12.x


    title
  • 11.x


    title

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"
        }
    ]
 }

相关文章

  • node内存控制

    垃圾回收机制 nodejs在执行JavaScript时,内存受到v8限制,64位约为1.4g,32位0.7g 所有...

  • Node的内存控制

    Node的内存控制 Allocation failed — process out of memory 如果您看到...

  • 深入浅出Node.js_内存控制

    内存控制 内存控制是在海量请求和长时间运行的前提下进行探讨的。 在Node中如何高效地使用内存? V8 的垃圾回收...

  • node 内存控制与Steam

    javascript对象在v8引擎堆中创建,v8引擎会自动回收没有引用的对象 下面摘自《深入浅出nodejs》: ...

  • 理解 Node.js 的 GC 机制

    《深入浅出Node.js》第五章《内存控制》阅读笔记 随着 Node 的发展,JavaScript 的应用场景早已...

  • Node.js的内存控制

    内存限制 Node基于V8构建,所以存在一定的内存限制(64位系统下约为1.4GB, 32位系统下约为0.7GB)...

  • nodejs深入学(6)内存控制

    前言 因为node绝大多数时间都是运行在后端的服务器程序,因此,需要精确控制内存。在以前,js程序员不需要控制内存...

  • 深入浅出Node.js学习笔记(五)

    内存控制 基于无阻塞、事件驱动建立的Node服务,具有内存消耗低的优点,非常适合处理海量的网络请求。 1. V8的...

  • 2020-08-28-Node内存控制

    V8内存 V8内部的内存对象分为新生代和老生代,新生代是代表存在时间较短,很快被释放内存空间的对象,而老生代对象则...

  • Node.js内存管理机制分享

    Node.js内存管理Node.js的一些选项GC研究例子生产环境的设置 1. Node.js如何管理内存 [解惑...

网友评论

      本文标题:Node的内存控制

      本文链接:https://www.haomeiwen.com/subject/dyilrrtx.html