V8垃圾回收机制

时间 : 14-10-05 评论 : 0 点击 : 1,269 次

V8是Google开发的开源Javascript引擎,以高性能著称。Chrome在浏览器评测中,速度最快,占用内存最小,离不开V8这颗强有力的心脏。
*V8的内存限制*

64位系统下约为1.4GB,32位系统下约为0.7GB。限制内存大小主要是出于垃圾回收效率考虑,执行垃圾回收时,需要stop-the-world,完全停止应用逻辑的执行,越大的内存,意味着需要“全停顿”的时间越长。chrome的每个标签页都有独立的V8实例,因此在浏览器上0.7G的内存是完全够用的。NodeJs也使用V8引擎,同样收到内存大小的限制,可以在启动的时候,指定内存限制大小。另外,Node对于大量内存操作的场景有自己的内存分配算法,不通过V8分配。

*V8的内存分代*
将内存分为新生代和老生代两种类型。新生代内存区域非常小,最大值在64位和32位系统上分别是32M和16M。大部分对象都被分配在新生代。回收时,发现一个对象经历过一次From到To的复制依然存活,则它不会被复制到To,而是被复制到老生代。From复制到To的过程中,发现To已使用空间超过一定比例时,From中的后续对象将会被直接复制到老生代内存区。

*Scavenge算法*
新生代中的对象主要使用Scavenge算法进行垃圾回收。Scanvenge主要采用Cheney算法,将内存分为大小相同的两块,处于使用态的空间称为From空间,处于闲置态的空间称为To空间。开始垃圾回收时,检查From空间中的存活对象,将存活对象复制到To空间,完成一次垃圾回收后,From空间和To空间角色互换。

Scavenge算法的缺点是只能利用一半的内存空间,对于新生代这种内存比较小的空间来说,浪费空间较少,效率高。

*Mark-Sweep算法*

Mark-Sweep分为标记和清除两个阶段,标记阶段遍历所有对象,并标记出存活对象,清除阶段把没有标记的对象回收。该算法最大问题是内存碎片问题。

*Mark-Compact*

Mark-Compact第一步也是标记,不同之处在于第二步,回收的时候会将存活的对象往一端移动,使的内存没有碎片。Mark-Compact算法由于需要移动内存,效率较低。V8对于老生代内存区,优先使用Mark-Sweep算法,没有足够大的整块空间时才会使用Mark-Compact算法。
为了减少stop-the-world带来的停顿时间,V8引入延迟处理与增量式整理,让垃圾回收的最大停顿时间较少到原来的1/6。另外,V8计划引入并行标记与清理,充分利用多核cpu,进一步减少停顿时间。

javascript

V8垃圾回收机制:等您坐沙发呢!

发表评论