在下面的 JS 代码中,example1
或 example2
会被垃圾收集器清理吗? 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/