网络工作者有自己的垃圾收集器吗?
Do web workers get their own Garbage Collector?
我有一些处理过程不一定 cpu 密集,但会创建大量临时对象,这会导致垃圾收集器在动画等过程中出现令人不快的问题。
将临时对象创建过程卸载给网络工作者是否有助于缓解这种情况?换句话说 - GC 问题会被隔离到 Web 工作线程而不影响我的主线程,还是 GC 会影响两个线程?
ECMAScript规范没有规定任何形式的内存管理,垃圾回收仅在非规范部分提及。
同样,web worker 规范除了 wrt 之外并没有太多关于垃圾收集的内容。某些对象必须存在多长时间。
所以这是特定于实现的行为。即使实施实现了每个工作人员的 GC 并在一般情况下避免了共享开销,它们仍可能由于内存压力而触发所有工作人员的全局收集,尤其是在内存受限的系统上。
也就是说,与不使用 worker 相比,使用 worker 更有可能实现某种 GC 隔离。但是你必须注意避免工作线程和主线程之间的消息传递开销,因为序列化消息(对于结构化克隆算法)会产生额外的垃圾。使用可转移或共享内存缓冲区可以避免这种情况。
我有一些处理过程不一定 cpu 密集,但会创建大量临时对象,这会导致垃圾收集器在动画等过程中出现令人不快的问题。
将临时对象创建过程卸载给网络工作者是否有助于缓解这种情况?换句话说 - GC 问题会被隔离到 Web 工作线程而不影响我的主线程,还是 GC 会影响两个线程?
ECMAScript规范没有规定任何形式的内存管理,垃圾回收仅在非规范部分提及。
同样,web worker 规范除了 wrt 之外并没有太多关于垃圾收集的内容。某些对象必须存在多长时间。
所以这是特定于实现的行为。即使实施实现了每个工作人员的 GC 并在一般情况下避免了共享开销,它们仍可能由于内存压力而触发所有工作人员的全局收集,尤其是在内存受限的系统上。
也就是说,与不使用 worker 相比,使用 worker 更有可能实现某种 GC 隔离。但是你必须注意避免工作线程和主线程之间的消息传递开销,因为序列化消息(对于结构化克隆算法)会产生额外的垃圾。使用可转移或共享内存缓冲区可以避免这种情况。