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-Sweep 和 Mark-Compact 相结合的方式进行垃圾回收
Mark-Sweep 遍历堆内存中的所有对象,并标记活着的对象,只清除没有被标记的对象
劣势:内存空间会出现不连续的状态
优势:因为失活对象少,清除快;
Mark-Compact:将活着的对象向内存空间的一端移动,移动完成后,直接清理掉边界外的所有内存
处理内存碎片
总结: 活对象在新生代中只占较少部分,死对象在老生代中只占较少部分, 这就是两种回收方式都能高效处理的原因。