Nodejs内存机制

Nodejs对于内存控制力非常的糟糕,主要原因来源于两方面。其一是JavaScript语言导致的,例如闭包,全局变量等。另外一方面则是V8引擎对内存分配的规则所限制。

如果在浏览器端,内存泄露,精确控制并没有太大必要,用户场景决定了你不需要精确控制内存,而服务器端,一旦出现内存泄露,随着访问量的提升,最终会导致进程被退出。

内存极限值

在V8引擎对于内存的设计上,有内存极限值一说,64位系统下可使用最多内存为1.4GB,32位系统下可使用最大内存为0.7GB。如果你的应用程序使用内存超过以上限制,那么进程将被退出。对于服务器端应用来说,这是我们不太希望的内存规则。

究其原因,是因为在V8做垃圾回收时,需要消耗一定时间,内存过大导致时间过长,引擎线程阻塞,当我们的程序卡顿一段时间。

调整内存极限值

如果需要调整内存极限值,可在启动node应用时,添加 --max-old-space-size--max-new-space-size 命令参数即可。

新生代与老生代

在V8分配的堆中,如果一个对象所占内存时间较短,则被放置于新生代中。此对象长时间使用,则转移到老生代中,成为常驻内存。

判断一个对象是新生代还是老生代,V8使用Scavenge算法。而新生代中的垃圾回收则使用Cheney算法。