V8的垃圾回收机制与内存限制
process.memoryUsage()方法返回Node.js进程的内存使用情况的对象,该对象每个属性值的单位为字节。
V8的垃圾回收机制
1.V8的垃圾回收算法
- V8的内存分代
V8,主要讲内存分为新生代和老生代两代。V8堆的整体大小就是新生代所用内存空间加上老生代的内存空间。
启动时(不会动态分配),可以使用–max-new-space-size设置新生代内存空间的大小, –max-old-space-size设置老生代内存空间的大小。
老生代的设置在64位系统之下为1400MB,在32位系统下为700MB。
新生代的设置在64位系统之下为32MB,在32位系统下为6MB。 - Scavenge算法
Scavenge算法主要采用了Cheney算法。
Cheney算法是一种采用复制的方式实现的垃圾回收算法。它将堆内存一分为二,每一部分空间称为semispace。在这两个semispace空间中,只有一个处于使用中,另一个处于闲置状态。处于使用状态的称为From空间,处于闲置状态的称为To空间。当我们分配对象时,先在From空间中分配。当开始进行垃圾回收时,会检查From空间中的存活对象,这些存活对象将被复制到To空间中,而非存活对象占用的空间将被释放。完成复制后,From空间和To空间角色发生对换。
当一个对象经过多次复制依然存活时,它将会被认为是生命周期较长的对象。会被移动到老生代中,采用新的算法进行管理。(晋升)
晋升的条件:①对象是否经历过Scavenge算法;②To空间的内存占用比超过限制。 - Mark-Sweep&Mark-Compact
Mark-Sweep:在标记阶段遍历堆中所有的对象,并标记获得对象,在随后的清楚阶段中,只清除没有被标记的对象。
缺点:进行一次标记清除后,内存空间会出现不连续的状态。
Mark-Compact:在整理的过程中,将活的对象往一端移动,移动完成后,直接清除掉边界外的内存。 - Incremental Marking
为了避免全停顿。V8从标记阶段入手,将原本要一口气停顿完成的动作改为增量标记。垃圾回收与应用逻辑交替执行直至标记阶段完成。回收日志
node –trace_gc高效使用内存
- 作用域
- 闭包
内存指标
- process.memoryUsage()
- os.totalmem()
- os.freemem()
本文结束啦感谢您的阅读