Cri*_*sty 5 javascript garbage-collection v8 node.js
假设我有一个很长的运行循环:
// Let's say this loop takes 10 seconds to execute
for(let i = 0; i <= 1000000; ++i) {
const garbage = { i };
// some other code
}
Run Code Online (Sandbox Code Playgroud)
垃圾收集器可以在循环期间运行,还是只能在应用程序空闲时运行?
我没有找到任何与此相关的文档,但是因为 Node.js 具有--nouse-idle-notification理论上禁用 GC 的功能,所以我认为 GC 仅在发送空闲通知时运行(当主线程不忙时)。
我之所以这么问是因为我的循环有时会在执行时间上出现峰值,并且想知道 GC 是否有可能在循环期间运行,从而导致延迟峰值。
V8 开发人员在这里。简短的回答是 GC 可以随时运行,并且会在需要时运行。
请注意,GC 是一个相当复杂的系统:它执行几个不同的任务,并且以增量步骤和/或与主线程并发执行其中的大部分任务。特别是,每次分配都可以触发一些增量 GC 工作。(这意味着通过非常小心地避免所有分配,您可以构建在运行时不会导致 GC 活动的循环;但循环从来不会积累无法收集的垃圾——除非您的内存有泄漏代码当然,其中对象无意中保持可访问。)
垃圾收集器可以在循环期间运行,还是只能在应用程序空闲时运行?
它绝对可以并且将在循环期间运行。
Node.js 有 --nouse-idle-notification 理论上会禁用 GC
不,不是的。没有办法禁用 GC。该标志禁用触发 GC 活动的一种特定机制,但这仅意味着 GC 将被其他机制触发。
GC 仅在发送空闲通知时运行(当主线程不忙时)
不,这个想法是在有空闲时间时运行一些额外的GC 周期,以在应用程序不忙时节省一些内存。
我的循环有时会在执行时间上出现峰值,我想知道 GC 是否有可能在循环期间运行,从而导致延迟峰值
那可能是。它还可能与函数的优化或去优化有关。或者可能是其他原因——例如,操作系统中断您的进程或将其分配给另一个 CPU 内核,或其他数百种原因。计算机是复杂的机器;-)
如果您将变量设置为 null -- 垃圾收集会立即完成
不它不是。垃圾收集永远不会立即完成(至少在 V8 中不是)。
| 归档时间: |
|
| 查看次数: |
1670 次 |
| 最近记录: |