nodejs中的垃圾回收机制

nodejs是基于v8引擎开发的,v8的设计是为浏览器设计的,所以V8的内存相对较少,可以通过node –max-old-space-size=1700(单位是MB)
V8的内存分为2代,一种是新生代,主要存放对象为存活时间比较短的对象,另一种是老生代,主要存放较长时间或常驻内存的对象.

垃圾回收算法

Scavenge算法
新生代主要是通过Scavenge算法进行垃圾回收,该算法主要采用了Cheney算法。
Cheney算法
是一种采用了复制的方式实现的垃圾回收算法,将堆内存一分为二,每一部分空间成为semispace。在这2个semispace空间中,只有一个处于使用状态,另一个处于闲置状态,处于使用中的空间称为FROM空间,处于闲置状态的称为TO空间,在我们分配对象的时候,先在FROM空间中分配空间。
垃圾回收时,先在from空间中查找存活的对象,将其复制到to空间中,而非存活的对象将会被释放,随后对from和to空间中空间进行角色对换,如果一个对象经过多次复制依然存活的话,那么她被认为是存活时间比较长的对象,这种生命周期较长的对象会被移到老生代中,老生代中会采用新的算法进行管理。该过程被称为晋升。
晋升后的老生代采用mark-sweep算法和mark-compact算法
是在标记阶段遍历堆中所有的对象,并且标记活的对象,在随后的清除阶段中,只清除没有被标记的对象。
Scavenge算法是只复制活着的对象,而Mark-Sweep只清除死亡的对象。
但是Mark-Sweep算法存在一个重大的问题就是进行一次清理后,会造成内存碎片,使内存出现不连续的状态。这种内存碎片会对后续的内存分配造成问题,一旦有一个大对象要分配的情况,所有的碎片空间都无法完成此次分配,就会提前出发垃圾回收,而这次垃圾回收是没有必要的。因而为了解决Mark-Sweep内存碎片问题,Mark-Compact被提出来。
Mark-Compact算法
参考链接