代码之家  ›  专栏  ›  技术社区  ›  XCS

当主线程繁忙时是否可以进行垃圾收集?

  •  1
  • XCS  · 技术社区  · 6 年前

    假设我有一个长循环:

    // Let's say this loop takes 10 seconds to execute
    for(let i = 0; i <= 1000000; ++i) {
        const garbage = { i };
        // some other code
    }
    

    垃圾收集器可以在循环期间运行,还是只能在应用程序空闲时运行?

    我没有找到任何与此相关的文档,但是因为Node.js具有 --nouse-idle-notification

    我之所以问这个问题是因为我的循环有时会出现执行时间峰值,我想知道GC是否可能在循环期间运行,从而导致延迟峰值。

    2 回复  |  直到 6 年前
        1
  •  7
  •   jmrk    6 年前

    它绝对可以并且将在循环期间运行。

    js有--nouse idle通知,这在理论上禁用了GC

    不,没有。没有办法禁用GC。该标志禁用了触发GC活动的一个特定机制,但这只意味着GC将由其他机制触发。

    GC仅在发送空闲通知时运行(当主线程不忙时)

    额外的 GC在有空闲时间时循环,在应用程序不忙时节省一些内存。

        2
  •  0
  •   Alon Yampolski    6 年前

    作为一个概念,垃圾收集器在一个单独的线程中工作,因为这样它就不会阻塞主线程(在大多数情况下是UI线程)。

    对于您的示例,与此循环“并行”运行的垃圾收集线程没有问题,因为其中的值 const garbage = {key: i} 只要它是 referenced .

    several generations 垃圾收集器在完全删除值之前传递它们。