v8垃圾回收机制:首先在不同的机器设备上所使用系统分配的内存大小是不一样的、64位系统所分配的内存大小是1.5G而32位所分配的是0.7G的内存大小、v8把堆内存分为两种 新生代 老生代、而他们的加起来就是总的分配内存大小、新生代所占的内存大小也和设备有关、分别是32MB和16MB

新生代

新生代里面又分成from和to两块、from是正在使用的内存、To是目前闲置的内存、当进行垃圾回收的时候、V8会将From里面进行检查一遍、把存活对象复制在To内存、如果是非存活对象直接进行回收、当所有的from对象被复杂到To内存中后、他们两的角色会进行调换、又To是正在使用、From是空闲、如此循环、角色调换的原因是当回收不使用的对象后会存在很多内存碎片、而我们分配堆内存是连续性的、这样我们就无法分配大的对象、所以我们就需要把这些内存碎片进行整理所以就会使用scavenge算法、对内存进行整理!

老生代

老生代里面一般存放着常使用的内存对象、如果内存对象在新生代中多次经过回收后依然存在 或者 To空间内存占用比超过25% 那就会被放到老生代内存中 所谓的晋升…、老生代的垃圾回收机制分为两步【添加标记,清除标记】、第一步给遍历所有内存对象打上标记、然后对代码环境中使用的变量和强引用的变量进行取消标记、剩下带有标记的就是需要收回的变量了、这样依然会有碎片内存的存在、所以第二部v8回整理内存碎片、直接简单粗暴把存活的对象往一端进行靠拢、移动会非常的慢!所以有了下面的优化、增量标记!

增量标记

增量标记就是把一次性遍历所有内存对象分成很多小部分进行完成、然后每完成一小部分就去执行js应用逻辑、然后在执行另外一小部分、直到全部的标记完成才进入内存碎片的整理阶段、这样就大大减少了每次都要去遍历所有内存对象+整理内存碎片时间、其主要还是因为会堵塞js运行、所以把大的批次拆成小的部分计算完成!

内存碎片化

移除了不存货的内存对象后就会变成左边那样、所以我们需要整理成右边的形式、这样才更好的分配可能大的对象

image.png

Scavenge—-新生代算法

image.png