在V8中,所有Javascript对象都是通过堆来进行内存分配的,然而在Node中通过Javascript使用内存时就会发现只能使用部分内存。为什么会有这个限制呢?深层原因是V8的垃圾回收机制的限制。按照官方的说法,以1.5GB的垃圾回收堆内存为例,V8做一次小的垃圾回收需要50ms以上,做一次非增量式的垃圾回收甚至要1s以上。这是垃圾回收中引起Javascript线程暂停执行的时间,在这样的花销下,应用的性男女和响应能力都会直线下降。所以能直接限制堆内存是一个很好的选择。
V8垃圾回收机制
在介绍垃圾回收机制之前,我们先来谈谈垃圾回收策略。
v8的垃圾回收策略是基于分代式垃圾回收机制。在实际应用中,对象的生存周期长短不一·,不同的算法只能针对特定情况具有最好的效果。为此,现代的垃圾回收算法中按对象的存活时间将内存的垃圾回收进行不同的分代,然后分别对不同分代的内存施以更高效的算法。
- v8内存分代
在v8中,主要将内存分为新生代和老生代两代。新生代中的对象为存活较短的对象,老生代中的对象存活时间较长。
v8堆的整体大小就是新生代所用内存空间加上老生代的内存空间。
- Scavenge算法(新