垃圾收集可以在主线程繁忙时进行吗?
Can garbage collection happen while the main thread is busy?
假设我有一个很长的 运行ning 循环:
// 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,所以我认为 GC 只有 运行发送空闲通知(当主线程不忙时)。
我问这个是因为我的循环有时会在执行时间上出现峰值,我想知道 GC 是否有可能在循环期间 运行 导致滞后峰值。
作为一个概念,垃圾收集器在一个单独的线程中工作,因为这样它就不会阻塞主线程(大多数情况下是 UI 线程)。
对于您的示例,"parallel" 中的垃圾收集线程 运行 对此循环没有问题,因为只要 const garbage = {key: i}
中的值不会被删除正在 referenced.
另请注意,several generations 垃圾收集器会在完全删除您的值之前将其传递。
这里是 V8 开发人员。简短的回答是 GC 可以随时 运行 并在需要时 运行 。
请注意,GC 是一个相当复杂的系统:它执行多个不同的任务,并且其中大部分以增量步骤 and/or 与主线程并发执行。特别是,每次分配都会触发一些增量 GC 工作。 (这意味着通过非常小心地避免所有分配,您可以构建不会导致 GC activity 而它们 运行 的循环;但循环累积无法收集的垃圾的情况永远不会发生 - - 当然,除非你的代码有泄漏,对象无意中保持可访问。)
Can the garbage collector run during the loop, or it can only run when the application is idle?
它绝对可以并且会在循环期间运行。
Node.js has the --nouse-idle-notification which in theory disables GC
不,不是。没有办法禁用 GC。该标志禁用了一种触发 GC 的特定机制 activity,但这仅意味着 GC 将由其他机制触发。
the GC only runs when the idle notification is sent (when the main thread is not busy)
不是,这个想法是运行一些额外的 GC 周期,当有空闲时间时,在应用程序不忙时节省一些内存。
my loop sometimes has spikes in execution time and want to know if it's possible that the GC might run during the loop, resulting in the lag spike
可能是这样。它也可能与函数的优化或去优化有关。也可能是其他原因——例如,操作系统中断您的进程或将其分配给另一个 CPU 内核,或其他数百种原因。计算机是复杂的机器 ;-)
if you set a variable to null -- garbage collection is done immediately
不,不是。垃圾收集永远不会立即完成(至少在 V8 中不会)。
假设我有一个很长的 运行ning 循环:
// 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,所以我认为 GC 只有 运行发送空闲通知(当主线程不忙时)。
我问这个是因为我的循环有时会在执行时间上出现峰值,我想知道 GC 是否有可能在循环期间 运行 导致滞后峰值。
作为一个概念,垃圾收集器在一个单独的线程中工作,因为这样它就不会阻塞主线程(大多数情况下是 UI 线程)。
对于您的示例,"parallel" 中的垃圾收集线程 运行 对此循环没有问题,因为只要 const garbage = {key: i}
中的值不会被删除正在 referenced.
另请注意,several generations 垃圾收集器会在完全删除您的值之前将其传递。
这里是 V8 开发人员。简短的回答是 GC 可以随时 运行 并在需要时 运行 。
请注意,GC 是一个相当复杂的系统:它执行多个不同的任务,并且其中大部分以增量步骤 and/or 与主线程并发执行。特别是,每次分配都会触发一些增量 GC 工作。 (这意味着通过非常小心地避免所有分配,您可以构建不会导致 GC activity 而它们 运行 的循环;但循环累积无法收集的垃圾的情况永远不会发生 - - 当然,除非你的代码有泄漏,对象无意中保持可访问。)
Can the garbage collector run during the loop, or it can only run when the application is idle?
它绝对可以并且会在循环期间运行。
Node.js has the --nouse-idle-notification which in theory disables GC
不,不是。没有办法禁用 GC。该标志禁用了一种触发 GC 的特定机制 activity,但这仅意味着 GC 将由其他机制触发。
the GC only runs when the idle notification is sent (when the main thread is not busy)
不是,这个想法是运行一些额外的 GC 周期,当有空闲时间时,在应用程序不忙时节省一些内存。
my loop sometimes has spikes in execution time and want to know if it's possible that the GC might run during the loop, resulting in the lag spike
可能是这样。它也可能与函数的优化或去优化有关。也可能是其他原因——例如,操作系统中断您的进程或将其分配给另一个 CPU 内核,或其他数百种原因。计算机是复杂的机器 ;-)
if you set a variable to null -- garbage collection is done immediately
不,不是。垃圾收集永远不会立即完成(至少在 V8 中不会)。