V8引擎的内存限制
- 在64位系统中分配的内存空间是1.4GB
- 在32位系统中分配的内存空间是0.7GB
V8引擎的内存分配
由新生代内存和老生代内存组成,新生代内存的大小为32MB(64位)和16MB(32位)
在这里插入图片描述
新生代内存的垃圾回收
新生代内存空间平均分为两份From和To两块空间,如下
垃圾回收的时候将存活对象从From复制到To空间中(注:在复制到To空间中的对象是依次存放的),将非存活对象回收即可,在下一次垃圾回收中又将To空间中的存活对象复制到From空间中一次存放
好处:解决了内存碎片问题
经过scavenge算法后会在另外一块空间中按序存放对象,这样便于后续对象的继续存放
坏处:将新生代内存等分为两份,导致只能在同时使用其中一块空间作为对象存储空间
老生代内存的垃圾回收
经过多次垃圾回收过后,对象依然存在会将该对象移动到老生代内存中,这个过程称为晋升。
触发晋升的条件有以下几种(满足其中之一就会触发晋升)
- 已经经历过一次上面提到的新生代scavenge算法回收,该对象依然存在
- To(空闲)空间占用超过25%(注:是为了留有足够的空间来存对象)
第一步:通过标记-清除法,将可以进行回收的对象清除
第二步:将存活的对象往一段靠拢,因为这是对象移动,所以这是整个过程中最耗时的过程
增量标记
基于如上老生代垃圾回收第二步的耗时性,V8引擎将垃圾回收拆解为很多小步骤,这样耗时时间减少为原来的1/6,
参考文档:
http://47.98.159.95/my_blog/blogs/javascript/js-v8/002.html