node.js 能用多少内存?

JavaScript028

node.js 能用多少内存?,第1张

偶然看到一个新近的讨论还在说 node.js 只能 1.x GB 内存,是因为 v8 引擎的 GC 在大内存下有问题什么的,觉得不太可能。于是写了个小程序:

在我的 MBP 上,这个需要 node --max-old-space-size=8574 t.js 才能跑起来。

顺便查了一下,早年确实有这个问题,不过 2011 年就已经修复了( https://bugs.chromium.org/p/v8/issues/detail?id=847 )。TJ 自己就经常开个 15G 内存跑( https://twitter.com/tjholowaychuk/status/480753206301966336 )。

网址: Download | Node.js (nodejs.org)

1、至此Node.js已经安装完成,可以先进行下简单的测试安装是否成功了,后面还要进行环境配;

2、在键盘按下【win+R】键,输入cmd,然后回车,打开cmd窗口;

3、安装完后的目录如下图所示;

4、此处说明下:新版的Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js依赖的包进行管理,也可以理解为用来安装/卸载Node.js需要装的东西。

5、输入 node -v 显示node.js的版本,说明node安装成功;输入 npm -v 显示npm`显示npm的版本,说明npm安装成功。

1、说明:这里的环境配置主要配置的是npm安装的全局模块所在的路径,以及缓存cache的路径,之所以要配置,是因为以后在执行类似:npm install express [-g] (后面的可选参数-g,g代表global全局安装的意思)的安装语句时,会将安装的模块安装到【C:\Users\用户名\AppData\Roaming\npm】路径中,占C盘空间

2、例如:我希望将全模块所在路径和缓存路径放在我node.js安装的文件夹中,则在我安装的文件夹【D:\Develop\nodejs】下创建两个文件夹【node_global】及【node_cache】。

3、执行命令

npm config set prefix "D:\Develop\nodejs\node_global"

npm config set cache "D:\Develop\nodejs\node_cache"

1、接下来设置环境变量,关闭cmd窗口,“我的电脑”-右键-“属性”-“高级系统设置”-“高级”-“环境变量”;

2、进入环境变量对话框,在【系统变量】下新建【NODE_PATH】,输入【D:\Develop\nodejs\node_global\node_modules】,将【用户变量】下的【Path】修改为【D:\Develop\nodejs\node_global】。

1、配置完后,安装个module测试下,我们就安装最常用的express模块,打开cmd窗口

2、输入如下命令进行模块的全局安装:

npm install express -g # -g是全局安装的意思

V8 为 Node.js 应用,默认只会分配了大概 1400 MB(仅本地测试的结果) 的内存空间。

超出了这个限额,就会内存溢出。

我们来写一段程序,制造一个内存溢出错误,

执行一下,

可以看到当内存占用达到 1400 MB 时,就报错了,

V8 使用了分代垃圾回收机制,将堆(heap)划分成了几个不同的空间。

参考一篇比较老的文章, A tour of V8: Garbage Collection #Heap organization

文中提到了 new-space 和 old-space,

大致含义是,新对象一般会先分配到 new-space 中(只有 1 - 8 M 大小),

new-space 满了以后会触发一次小型的(minor)垃圾回收,

如果对象经历了两次小型(minor)垃圾回收还活着,就会被移到 old-space 中(这个空间比较大)。

old-space 满了会经历一次大型(major)垃圾回收(采用标记-清除回收算法)。

所以,如果我们一直分配新对象且不释放它,就会最终被放到 old-space 中。

一旦 old-space 占用率超出限额,就会造成内存溢出。

注:

V8 的垃圾回收机制也是与时俱进的,

最近的一些进展,可参考 Trash talk: the Orinoco garbage collector ,

上面介绍的内容大同小异。

有以下两种方式,可以调整 old-space 大小,

在某些情况下,或许能暂时避免 Node.js 内存溢出。

我们来看看效果,

我们看到产生内存溢出时,内存占用情况不同了,

A tour of V8: Garbage Collection

Trash talk: the Orinoco garbage collector

Node.js - Command line options: --max-old-space-size=SIZE

Node.js - Command line options: NODE_OPTIONS=options...