在我的 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...