A闪的 BLOG 技术与人文
Nodejs对于内存控制力非常的糟糕,主要原因来源于两方面。其一是JavaScript语言导致的,例如闭包,全局变量等。另外一方面则是V8引擎对内存分配的规则所限制。
如果在浏览器端,内存泄露,精确控制并没有太大必要,用户场景决定了你不需要精确控制内存,而服务器端,一旦出现内存泄露,随着访问量的提升,最终会导致进程被退出。
在V8引擎对于内存的设计上,有内存极限值一说,64位系统下可使用最多内存为1.4GB,32位系统下可使用最大内存为0.7GB。如果你的应用程序使用内存超过以上限制,那么进程将被退出。对于服务器端应用来说,这是我们不太希望的内存规则。
究其原因,是因为在V8做垃圾回收时,需要消耗一定时间,内存过大导致时间过长,引擎线程阻塞,当我们的程序卡顿一段时间。
如果需要调整内存极限值,可在启动node应用时,添加 --max-old-space-size
和 --max-new-space-size
命令参数即可。
在V8分配的堆中,如果一个对象所占内存时间较短,则被放置于新生代中。此对象长时间使用,则转移到老生代中,成为常驻内存。
判断一个对象是新生代还是老生代,V8使用Scavenge算法。而新生代中的垃圾回收则使用Cheney算法。