- 在Node中通过JavaScript使用内存时只能使用部分内容,64位系统下约为1.4GB,32位系统下约为0.7GB.
- 当我们在代码中声明变量并赋值时,所使用对象的内存就分配在堆中.如果已申请的堆空间内存不够分配新的对象,将继续申请堆空间,直到堆的大小超过V8的限制为止.
- Node在启动时,可以通过设置参数来调整内存限制的大小.
node --max-old-space-size=1700 test.js //设置老生代内存空间最大值,单位为MB
node --max-new-space-size=1024 test.js //设置新生代内存空间最大值,单位为KB
v8的垃圾回收机制
-
V8的垃圾回收机制
V8中,主要将内存分为新生代和老生代两代.新生代中的对象为存活时间较短的对象,老生代中的对象为存活时间较长或常驻内存的对象 -
Scavenge算法(新生代)
新生代对象主要通过Scavenge算法进行垃圾回收.在Scavenge的具体实现中,主要采用了Cheney算法.
Cheney算法是一种采用复制的方式实现的垃圾回收算法.它将堆内存一分为二,每一部分空间称为semispace.在这两个semispace空间中,只有一个处于使用中另一个处于闲置状态,
处于使用状态的空间称为From空间,处于闲置状态的称为To空间.
当我们分配对象时,先是在From空间中进行分配,当开始进行垃圾回收时,会检查From空间中的存活对象,这些存活对象将被复制到To空间中,而非存活对象将被释放.完成复制后,From空间和To空间的角色发生交换.
Scavenge算法的缺点:只能使用堆内存的一半.但由于新生代中对象的生命周期较短,所以很适合这个算法.
当一个对象经过多次复制依然存活时(检查内存地址),它将被认为是生命周期较长的对象,所以随后会被移动到老生代中.从新生代中移到老生代中的过程成为晋升
对象晋升的条件有两个:
1.对象是否经历