V8介绍
- V8是一款主流的JavaScript执行引擎
- V8采用即时编译,运行效果快
- V8内存设限(64位|1.5G,32位|800M)
V8垃圾回收策略
- 采用分代回收的思想,因为内存有上限
- 内存分为新生代(32M|16M),老生代
- 针对不同对象采用不同算法
V8回收新生代对象策略
- V8内存分配
V8内存空间分为老生代和新生代,新生代指存活时间较短的对象(局部作用域定义的变量,使用完之后就可以被垃圾回收;而全局的变量,需程序执行完之后才能被回收),新生代中又一分为二From和To空间
-
垃圾回收实现
回收过程采用复制算法+标记整理算法,From空间位使用空间,保存活动对象,To为空闲空间;From空间完成标记整理后将活动对象拷贝到To空间,然后再次交换空间并释放To空间
-
回收细节
拷贝过程中某一个变量在老生代对象中也会出现,这是就出现晋升,晋升就是将新生代对象移动至老生代对象进行存储
判断标准:一轮GC过后还存活的新生代对象;To空间使用率超过25%,因为回收完成,To空间会转换到From空间,如果占比过高,会影响后续内存分配
V8回收老生代对象策略
老生代对象指存活时间较长的对象,64为操作系统1.4G,32位700M
-
垃圾回收实现
采用标记清除完成垃圾空间的回收、采用标记整理进行空间优化、采用增量标记算法进行效率优化
-
与新生代对比
新生代垃圾回收采用空间换时间的策略,因为空间小;而老生代不适合复制算法,因为老生代空间大,会导致有一半空间会不能使用;并且老生代对象多,复制存活对象的效率很低
-
标记增量优化垃圾回收
标记增量为解决标记清除的长卡顿问题(老生代对象多,垃圾回收时间长,垃圾回收与程序运行同步执行,GC太多会导致程序卡顿,为减少卡顿,V8对标记进行优化,将一次停顿进行得标记过程,分成了很多小步,每执行完一小步程序执行一会,这样交替多次后完成标记)
网友评论