V8垃圾回收

150 阅读2分钟

V8能做什么?

编译js 内存分配 运行js 垃圾回收

其他语言?

malloc分配 free清理,只不过v8帮js做了

V8垃圾回收策略

变量的生存周期短(新生代)

对象开始都会被分配到新生代(如果新生代内存空间不够,直接分配到老生代);
保存一个指向内存空间的指针,根据分配对象的大小递增指针(内存大小),存储空间快满时,进行一次垃圾回收

from(活跃) to(闲置)      
先在 from 空间中分配了3个对象A、B、C       
GC判断对象B没有其他引用(回收),对象A和C依然为活跃对象   
A C 复制到to空间(空间紧缩)   
清空from  交换from to空间
from空间又新增2个对象D、E(A C D E)   
下一轮GC发现对象D没有引用了,做标记,步骤同上

优劣势:

  • 生命周期短的存活对象只占少部分,存活对象少,复制性能快;
  • Scavenge的缺点是只能使用堆内存的一半,这是由划分空间和复制机制所决定的。

晋升

  • 当一个对象经过多次复制仍然存活时,它就会被认为是生命周期较长的对象。这种较长生命周期的对象随后会被移动到老生代中,采用新的算法进行管理。

  • 当要从From空间复制一个对象到To空间时,如果To空间已经使用了超过25%,则这个对象直接晋升到老生代中

老生代

Mark-SweepMark-Compact 相结合的方式进行垃圾回收

Mark-Sweep 遍历堆内存中的所有对象,并标记活着的对象,只清除没有被标记的对象
劣势:内存空间会出现不连续的状态
优势:因为失活对象少,清除快;

Mark-Compact:将活着的对象向内存空间的一端移动,移动完成后,直接清理掉边界外的所有内存
处理内存碎片

总结: 活对象在新生代中只占较少部分,死对象在老生代中只占较少部分, 这就是两种回收方式都能高效处理的原因。