APP下载

JavaScript引擎V8使用新垃圾回收器Orinoco,能有效减少WebGL游戏50%的停顿时间

消息来源:baojiabao.com 作者: 发布时间:2024-04-27

报价宝综合消息JavaScript引擎V8使用新垃圾回收器Orinoco,能有效减少WebGL游戏50%的停顿时间

Chrome所使用的开源JavaScript引擎V8,使用了新的垃圾回收器(Garbage Collector)Orinoco,除了具一般垃圾回收器的功能外,Orinoco还有平行(Parallel)、并行(Concurrent),且具渐增(Incremental)回退功能,能大幅降低应用程序延迟问题。

一般垃圾收集器的基本任务,会辨识物件存活,一旦物件过期,垃圾收集器便着手回收,并重新使用物件占用的内存,进阶的功能还会对内存进行压缩或是去碎片化。这些工作可以依序执行,或是任意交错进行。

V8中会把内存堆积分为新生世代(Generation)与年老世代,新生世代又分为托儿所(Nursery)与中间(Intermediate)两个子代。物件分配最先进到托儿所,当在第一次的垃圾收集中存活下来,仍然被算作新生世代,但会从托儿所移往中间世代,并于下一次垃圾收集存活,被移往老年世代。在V8中有两种垃圾回收器,主要垃圾回收器从整个堆积(Heap)中收集垃圾,而次要垃圾回收器则收集新生世代的垃圾。

官方提到,目前衡量垃圾回收花费的时间,是主执行绪在执行垃圾收集时所暂停的时间。Orinoco是一个垃圾收集专案的代号,V8团队为其垃圾收集器,新增一系列垃圾收集最佳化算法,以释放主执行绪,避免Chrome发生明显的停顿。新的垃圾收集器主要使用三种技术,包含平行、渐增以及并行。

垃圾收集器的平行执行,是让主执行绪以及帮手执行绪分担差不多的垃圾收集工作,虽然主执行绪仍需要暂停执行JavaScript,但是总暂停时间会是,原本暂停时间除以参与工作的执行绪数,当然会有一些同步的成本,但是分摊下来暂停的时间仍然会比原本短得多,官方提到,平行执行是三种技术实现最简单的一种。

渐增技术是让主执行绪间歇性的执行少量的垃圾回收工作,让主执行绪一次进行一部分的工作,这样主执行绪就不再需要完全停下来进行垃圾回收,官方提到,这个比平行执行还更加困难,因为JavaScript要在每个渐增工作区段执行,这代表内存堆积的状态已经改变,可能使先前的渐增工作完全无效。虽然这个方法不会减少主执行绪花费在垃圾收集的时间,但是却能有效解决主执行绪延迟。

第三个也是最困难的技术是并行执行,是当主执行绪在持续执行JavaScript时,让帮手执行绪在背景进行垃圾收集。官方解释,之所以这是最困难的技术,因为JavaScript堆积上的所有内容,现在随时都可能会变更,导致之前完成的工作失效,且主执行绪和帮手执行绪存在读写竞争。不过,好处是主执行绪可以无后顾之忧的自由执行JavaScript。

现在V8的主要垃圾收集器,当堆积接近动态计算限制的时候,便会启动并行标记任务,在主行绪执行JavaScript的时候,每个帮手执行绪对分配的物件,进行追踪并完成标记,最后主执行绪才会开始暂停,重新扫描一次Root确保存活的物件都被上了标记,并与数个帮手执行绪开始进行平行压缩以及更新指标,而这个过程主行绪仍然可以再穿插执行JavaScript。

而负责进行新生世代垃圾收集工作的次要垃圾收集器,现在也能够平行收集垃圾,并跨帮手执行绪地分散作业,对被分派到且历经第一次垃圾收集存活的物件,执行搬移(Evacuate)集中的工作。

新的垃圾回收器大幅改善了Chrome暂停时间、延迟与页面载入缓慢的问题,让动画、页面滚动和使用者互动更加顺畅,具平行执行功能的次要垃圾收集器,能够减少20%到50%主执行绪进行新生世代垃圾回收的时间成本,而且并行执行标记与清扫内存,可以减少WebGL游戏暂停时间达50%。官方提到,他们的工作还没结束,Chrome中的渲染器Blink还有一个垃圾回收器Oilpan,他们要将Orinoco的技术移植过去。

官方特别提到,虽然开发人员在撰写JavaScript程式的时候,不需要考虑垃圾收集,但是了解内部运作将有帮助提升内存使用,有效应用良好的程式开发范式。

2019-01-16 01:37:00

相关文章