V8垃圾回收策略
采用分代回收的思想 内存分为新生代、老生代 针对不同对象采用不同算法
V8中常用的GC算法
分代回收 空间复制 标记清除 标记整理 标记增量
V8内存分配
V8内存空间一分为二 小的空间用于存储新生代对象(64位是32M,32位是16M) 新生代指的是存活时间较短的对象 老年代对象存放在右侧老生代区域(64位系统1.4G,32位 700M) 老年代对象就是指存活时间较长的对象
V8新生代对象的回收
回收过程采用复制算法+标记整理 新生代内存分为两个等大小空间 使用空间为From,空闲空间为To 活动对象存储在From空间 标记整理后将活动对象拷贝至To空间 From与To交换空间完成释放
回收细节说明
拷贝过程可能出现晋升 晋升就是讲新生代对象移动到老生代 一轮GC还存活的新生代需要晋升 To空间的使用率超过25%的话,也需要晋升
V8老生代对象的回收
主要采用标记清除、标记整理、增量标记算法 首先使用标记清除完成垃圾空间的回收 采用标记整理进行空间优化(当晋升的时候发现,老生代没有足够的空间存放新生代对象的时候,就会进行标记整理的操作) 采用增量标记进行效率优化
新老细节对比
新生代区域垃圾回收使用空间换时间 老年代区域垃圾回收不适合复制算法,空间比较大,存放的数据多,消耗的时间会比较多
标记增量算法
当垃圾回收进行工作其实是会阻塞JS的执行的。
标记增量的方法是把我们垃圾回收的操作,拆分成多个小步,组合去完成整个回收,从而去替代以前一口气完成的垃圾回收。这样可以程序执行和垃圾回收交替执行,时间消耗更加合理一些。
中间的标记可能是标记可达元素的子元素之类的。
把以前很长的停顿时间拆成小段,用户体验更好一些。
内存问题外在表现
都是在网络状况正常的情况下
页面出现延迟加载或经常性暂停 页面持续性出现糟糕的性能 页面性能随时间越长越来越差(内存泄漏)