javascript - Node 中的全局变量是否被垃圾收集器清理?

标签 javascript node.js memory-leaks

在下面的 JS 代码中,example1example2 会被垃圾收集器清理吗? GC 会释放它们的内存吗?我正在处理内存泄漏,并且我的代码中有一些这样的实例。

example1 = 'Outside a function'

function sample(x){
    example2 = 'Inside a function'
}
sample(1)

据我了解,垃圾收集器不会清除这两个变量,因为它们被视为全局变量。听起来可能是一个微不足道的问题,但查找内存泄漏就像大海捞针一样

最佳答案

堆有两个主要部分,新空间和旧空间。新空间是新分配发生的地方;这里收集垃圾的速度很快,大小约为 1-8MB。生活在新空间中的物体被称为年轻一代。在旧空间中,在新空间中从收集器中幸存下来的对象被提升到旧空间中 - 它们被称为老一代。 Old Space 中的分配速度很快,但回收成本较高,因此很少执行。

您需要了解一些想法,例如:

1 - 垃圾收集器构建一个“根”列表。根通常是全局变量,其引用保存在代码中。在 JavaScript 中,“window”对象是可以充当根的全局变量的示例。窗口对象始终存在,因此垃圾收集器可以认为它及其所有子对象始终存在(即不是垃圾)。

2 - 检查所有根并将其标记为事件(即不是垃圾)。所有子项也会被递归检查。从根可以到达的所有内容都不被视为垃圾。

3- 所有未标记为事件的内存现在都可以被视为垃圾。收集器现在可以释放该内存并将其返回给操作系统。

关于你的问题:

From what I understand is neither of the variables will ever be cleaned by Garbage collector because they are treated as global variables. 
Might sound like a trivial question but finding memory leaks is like finding a needle in a haystack

你是对的。

关于javascript - Node 中的全局变量是否被垃圾收集器清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56613744/

相关文章:

node.js - 从 nodejs 脚本发送直接消息到 Telegram

html - 列出 Jade 模板内目录中的文件

azure - 是否可以从 Azure Web 角色实例下载转储文件

Flutter 内存泄漏 - Flutter Bloc

JavaScript/jQuery 提交函数/AJAX 调用可以从控制台运行,而不是从链接文件运行

javascript - 在 GWT 中使用 SVG

javascript - 如何使用 Node js读取上传到谷歌云存储的JSON文件的内容

javascript - js验证只运行一次

javascript - 清除 HTML5 Canvas 中的笔划路径(在循环内)

java - 我应该通过 response.getOutputStream() 显式关闭 ZipOutputStream 吗?