Node 内存控制
-
Node 只能使用部分内存,原因:
node 基于 V8 构建,V8 的内存管理机制限制了内存的用量。
在实际的使用中,不小心触碰到这个内存界限,会造成进程退出。
V8 是通过堆来进行内存分配的;在代码中声明对象并赋值时,所使用对象的内存就分配在堆中;如果已申请的堆空闲内存不够分配新的对象,将继续申请堆内存,直到堆的大小超过 V8
的限制为止。
V8 为何要限制堆的大小?原因是 V8 的垃圾回收机制的限制。
垃圾回收会引起 JavaScript 线程暂停执行;内存太大,垃圾回收时间太长,在当时的考虑下,直接限制了堆内存大小。
这个内存限制能打开,node 在启动时传递 --max-old-space-size 或 --max-new-space-size 来调整内存限制的大小,示例如下:
node --max-old-space-size=1700 test.js
或者
node --max-new-space-size=1024 test.js
上述参数在V8初始化时生效,一旦生效就不能再动态改变。 -
V8 的垃圾回收机制
v8 的垃圾回收策略,主要基于分代式垃圾回收机制
。
在 v8 中,主要将内存分为新生代
和老生代
两代。
v8 堆的整体大小,就是新生代所用内存空间加上老生代所用内存空间。
默认分配内存大小:
系统\生代 | 老生代 | 新生代(默认) | 新生代(最大) |
---|---|---|---|
64位系统 | 1400MB | 32MB | 64MB |
32位系统 | 700MB | 16MB | 32MB |