Js 捕捉产生后抛出的 ENOMEM 错误

我的 Node.js 脚本在使用 产卵时由于抛出 ENOMEM (内存不足) errnoException 而崩溃。

错误是:

child_process.js:935
throw errnoException(process._errno, 'spawn');
^


Error: spawn ENOMEM
at errnoException (child_process.js:988:11)
at ChildProcess.spawn (child_process.js:935:11)
at Object.exports.spawn (child_process.js:723:9)
at module.exports ([...]/node_modules/zbarimg/index.js:19:23)

我已经为 errorexit事件使用了侦听器,但是在出现这个错误的情况下,它们都没有被激发。

我的代码:

zbarimg = process.spawn('zbarimg', [photo, '-q']);
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... });

完整源代码 有空

有没有什么方法可以防止脚本崩溃? 如何捕捉抛出的 ENOMEM 错误?

80812 次浏览

You can try changing the amount of memory node uses with this command: node ----max-old-space-size=1024 yourscript.js

--max-old-space-size=1024 will allocate 1 gig of memory.

By default node will use 512 mb of ram but depending on your platform you may need to allocate more or less so the garbage collection kicks in when you need it.

If your platform has less than 500 mb of ram available then try setting the memory usage lower to --max-old-space-size=256.

I had the same problem and as it turned out, my system had no swap space enabled. Check if this is the case by running the command free -m:

vagrant@vagrant-ubuntu-trusty-64:~$ free -m
total       used       free     shared    buffers     cached
Mem:          2002        233       1769          0         24         91
-/+ buffers/cache:        116       1885
Swap:            0          0          0

Looking at the bottom row we can see we have a total of 0 bytes swap memory. Not good. Node can get pretty memory hungry and if no swap space is available when memory runs out, errors are bound to happen.

The method for adding a swap file varies between operating systems and distributions, but if you're running Ubuntu like me you can follow these instructions on adding a swap file:

  1. sudo fallocate -l 4G /swapfile Create a 4 gigabyte swapfile
  2. sudo chmod 600 /swapfile Secure the swapfile by restricting access to root
  3. sudo mkswap /swapfile Mark the file as a swap space
  4. sudo swapon /swapfile Enable the swap
  5. echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab Persist swapfile over reboots (thanks for the tip, bman!)

I've had the same problem and fixed with try / catch:

try {
zbarimg = process.spawn('zbarimg', [photo, '-q']);
} catch (err) {
console.log(err);
}
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... });

If you ever run into this problem in AWS Lambda, you should consider increasing the memory allocated to the function.

I fixed the issue by just disabling and re-enabling my Node Server.

This solved my problem :)

The issue with memory

free -m
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo “/swapfile none swap sw 0 0” | sudo tee -a /etc/fstab