javascript - JavaScript 垃圾收集器何时以及如何工作
问题描述
我确实在 MDN 上读过几篇这样的文章,这篇文章让我了解了 GC 在 JavaScript 中是如何发生的
我仍然不明白之类的东西
a) 垃圾收集器何时启动(它在某个时间间隔或必须满足某些条件后被调用)?
b) 谁负责垃圾收集(它是 JavaScript 引擎或浏览器/节点的一部分)?
c) 在主线程或单独线程上运行?
d) 以下哪一项具有更高的峰值内存使用率?
// first-case
// variables will be unreachable after each cycle
(function() {
for (let i = 0; i < 10000; i++) {
let name = 'this is name' + i;
let index = i;
}
})()
// second-case
// creating variable once
(function() {
let i, name, index;
for (i = 0; i < 10000; i++) {
name = 'this is name' + i;
index = i;
}
})()
解决方案
V8 开发人员在这里。简短的回答是:它很复杂。特别是,不同的 JavaScript 引擎,以及同一引擎的不同版本,会做不同的事情。
要解决您的具体问题:
a) 垃圾收集器何时启动(它在某个时间间隔或必须满足某些条件后被调用)?
要看。大概两者兼而有之。现代垃圾收集器通常是分代的:它们有一个相对较小的“年轻一代”,只要它满了就会被收集。此外,他们有一个更大的“老一代”,他们通常在许多小步骤中完成他们的工作,以便永远不会中断执行太长时间。触发这样一个小步骤的一种常见方法是自上一步以来已经分配了 N 个字节(或对象)。另一种方法,尤其是在现代选项卡式浏览器中,是在选项卡处于非活动状态或在后台时触发 GC 活动。除了这两个之外,很可能还有其他触发因素。
b) 谁负责垃圾收集(它是 JavaScript 引擎或浏览器/节点的一部分)?
垃圾收集器是 JavaScript 引擎的一部分。也就是说,它必须与相应的嵌入器进行某些交互,以处理其生命周期以某种方式与 JavaScript 对象相关联的嵌入器管理的对象(例如 DOM 节点)。
c) 在主线程或单独线程上运行?
要看。在现代实现中,通常两者都有:一些工作发生在后台(在一个或多个线程中),一些步骤在主线程上执行效率更高。
d) 以下哪一项具有更高的峰值内存使用率?
这两个片段将(可能)具有相同的峰值内存使用量:它们都不允许同时访问由多个迭代分配的对象。
编辑:如果你想了解更多关于 V8 最近所做的与 GC 相关的工作,你可以在这里找到一系列博客文章:https ://v8.dev/blog/tags/memory
推荐阅读
- wordpress - 帖子排序不正确
- javascript - 登录js和firebase后如何将用户重定向到另一个页面?
- swift - 除了 Cocoapods 之外,还有其他方法可以将 Firebase 整合到我的 iOS 应用程序中吗?
- dialogflow-es - 为什么 Dialogflow 意图通过 webhook 给出“默认响应不可用”?
- reactjs - 禁止换行符会破坏 JSX。为什么?
- node.js - 获取生成的进程环境
- javascript - 在 Web 上使用 GZIP 压缩十六进制字符串(Javascript)
- javascript - 如何在 Mirth Connect JavaScript 阅读器源连接器中获取频道信息?
- python-3.x - python中的磁偶极子
- javascript - 在jquery中增加克隆输入的名称属性