Web Workers是否有自己的垃圾回收器?

9

我有一些处理过程并不一定需要大量的CPU,但是会创建大量临时对象,在动画等过程中会导致令人不愉快的垃圾回收器抽搐。

将临时对象创建过程转移到Web Worker上是否有助于缓解这种情况?换句话说,GC抽搐是否会被隔离到Web Worker线程而不影响我的主线程,或者GC是否会同时影响两个线程?


我的猜测是他们会这样做,但这只是我的猜测。 - Ced
1个回答

7
ECMAScript规范没有指定任何形式的内存管理,垃圾收集只在非规范部分中提到。
同样,Web Worker规范对垃圾收集也没有太多说明,除了一些对象必须存在的时间。
因此,这是实现特定的行为。即使实现在常规情况下实现了每个工作者的GC并避免了共享开销,它们仍然可能由于内存压力而触发所有工作者的全局收集,特别是在内存受限的系统上。
话虽如此,使用工作者可能比不使用工作者更容易实现一些GC隔离。但是,您必须注意避免工作者和主线程之间的消息开销,因为序列化消息(用于结构化克隆算法)可能会产生额外的垃圾。使用可转移或共享内存缓冲区可以避免这种情况。

1
谢谢,接受了答案 :) 如果有一些关于主要浏览器如何选择实现这个的文档就太好了。你有这方面的信息吗? - davidkomer
3
它们的实现方式与垃圾回收属性不属于它们的保证范畴,因此它们不会为外部用户记录这些内容。但是,您仍然可以在它们的缺陷跟踪器或技术博客中找到相关信息。对于Firefox而言,GC已经被分隔一段时间了,所以有相当大的隔离性,但我提到的内存压力回调事件和一些共享内容也存在。简而言之:是的,有点像,但没有官方或指定的保证,这取决于具体情况,可能会发生变化,取决于实现方式。 - the8472

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接