gpt4 book ai didi

javascript - 了解 JavaScript 中的标记和清除算法

转载 作者:行者123 更新时间:2023-12-02 21:41:38 26 4
gpt4 key购买 nike

根据MDN标记和清除是比引用计数更好的垃圾收集算法,因为它避免了循环引用可能发生的内存泄漏。不过,我不明白为什么会这样?有人可以解释(用代码)标记和扫描如何避免此类内存泄漏吗?请随意使用 MDN 中的以下代码,其中解释了引用计数的工作原理:

var x = { 
a: {
b: 2
}
};

// 2 objects are created. One is referenced by the other as one of its properties.
// The other is referenced by virtue of being assigned to the 'x' variable.
// Obviously, none can be garbage-collected.

var y = x; // The 'y' variable is the second thing that has a reference to the object.

x = 1; // Now, the object that was originally in 'x' has a unique reference
// embodied by the 'y' variable.

var z = y.a; // Reference to 'a' property of the object.
// This object now has 2 references: one as a property,
// the other as the 'z' variable.

y = 'mozilla'; // The object that was originally in 'x' has now zero
// references to it. It can be garbage-collected.
// However its 'a' property is still referenced by
// the 'z' variable, so it cannot be freed.

z = null; // The 'a' property of the object originally in x
// has zero references to it. It can be garbage collected.

此外,全局变量永远不会被垃圾回收吗?

最佳答案

标记-清除的工作原理是标记根,例如临时变量(在当前方法中)和全局(静态)变量,然后清除堆以删除任何未标记的引用

例如,示例中的第一行创建一个嵌套对象并将其分配给变量 x。为了让 MS 知道它的字段 b 是否还活着,它首先标记根。

这通过检查当前方法(框架)中的所有全局变量和局部变量然后标记它们指向的引用来工作。例如,一个是 x 的外部对象。

这里需要注意的是,内部对象布局中的每个对象都(至少)保留了两个位,用于标记对象是否被引用。

var x = { a: {b: 2}}; 

因此,包含字段 a 的外部对象被标记为事件状态,因为它被局部变量引用。现在它也必须标记其字段引用的对象。字段 a 和 a.b 就是这样的对象。一旦对象的字段及其字段 fields 引用的所有引用都被标记,外部对象的第二位及其内部对象就会被标记。

为了简单起见,我们假设这是堆上唯一的事件对象。一旦标记阶段完成,堆(可以将其想象为通用对象的数组或列表)就可以被清除。因此,所有对象要么被完全标记(2 位),要么未被标记,即没有引用。所有未标记的对象都可以被释放,并且它们所占用的内存可以被重新使用。

现在循环引用的问题是一个对象a引用另一个对象b,反之亦然。使用引用计数时,只要一个对象有对其自身的引用,其引用计数字段将至少为 1。问题是没有根对象或由根间接引用的对象(也称为事件对象)引用循环对象,但根据算法,引用计数器等于或大于 1 意味着它还活着。

Mark-sweep 对事件对象的定义不同,即它直接或间接被根对象引用。

关于javascript - 了解 JavaScript 中的标记和清除算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60354194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com