什么是JavaScript垃圾收集?为了编写更好的代码,web程序员了解JavaScript垃圾收集的重要方面是什么?


当前回答

在javascript中,垃圾收集是不确定的,对象何时会被清除,或者是否会被清除。这适用于强引用的对象。强引用对象不受垃圾回收的影响。

在ES12之后,可以执行以下实现来检查对象何时被垃圾收集。

要了解更多关于javascript垃圾收集的知识,你可以使用ES12之后可用的终结器。

let a = new Array(200).fill(true);

构造定稿器

const cleanup = new FinalizationRegistry(key => {
  // your code here
});

cleanup.register(a, 'wewew');

对象'a'现在不可达,终结器回调将在垃圾收集后发生

其他回答

垃圾收集(GC)是通过删除不再需要的对象来自动进行内存管理的一种形式。

任何处理内存的进程都遵循以下步骤:

1 -分配你需要的内存空间

2 -做一些处理

3 -释放这个内存空间

有两种主要的算法用于检测哪些对象不再需要。

引用计数垃圾收集:该算法将“一个对象不再需要”的定义简化为“一个对象没有其他对象引用它”,如果没有引用点,该对象将被删除

标记扫描算法:将每个对象连接到根源。任何对象都不连接根或其他对象。该对象将被移除。

目前大多数现代浏览器使用第二种算法。

什么是JavaScript垃圾收集?

检查这个

对于web程序员来说,了解JavaScript垃圾收集的重要一点是, 为了写出更好的代码?

在Javascript中,你不关心内存分配和释放。整个问题都需要Javascript解释器来解决。在Javascript中泄漏仍然是可能的,但它们是解释器的错误。如果你对这个话题感兴趣,你可以阅读更多 www.memorymanagement.org

在计算机科学中,垃圾收集(GC)是自动内存管理的一种形式。垃圾收集器,或者仅仅是垃圾收集器,尝试回收垃圾或对象所使用的内存,这些对象将永远不会被应用程序再次访问或更改。”

所有JavaScript引擎都有自己的垃圾收集器,它们可能有所不同。大多数时候你不需要和他们打交道,因为他们只是在做他们应该做的事情。

写出更好的代码主要取决于你对编程原理、语言和特定实现的了解程度。

当涉及到DOM对象时,要注意循环引用:

JavaScript中的内存泄漏模式

请记住,只有在没有对对象的活动引用时才能回收内存。这是闭包和事件处理程序的一个常见陷阱,因为一些JS引擎不会检查内部函数中实际引用了哪些变量,而只是保留封闭函数的所有局部变量。

这里有一个简单的例子:

function init() {
    var bigString = new Array(1000).join('xxx');
    var foo = document.getElementById('foo');
    foo.onclick = function() {
        // this might create a closure over `bigString`,
        // even if `bigString` isn't referenced anywhere!
    };
}

只要事件处理程序存在,简单的JS实现就不能收集bigString。有几种方法可以解决这个问题,例如在init()末尾设置bigString = null (delete对局部变量和函数参数不起作用:delete将从对象中删除属性,并且变量对象不可访问-如果您试图删除局部变量,ES5在严格模式下甚至会抛出ReferenceError !)

如果您关心内存消耗,我建议尽可能避免不必要的闭包。

在javascript中,垃圾收集是不确定的,对象何时会被清除,或者是否会被清除。这适用于强引用的对象。强引用对象不受垃圾回收的影响。

在ES12之后,可以执行以下实现来检查对象何时被垃圾收集。

要了解更多关于javascript垃圾收集的知识,你可以使用ES12之后可用的终结器。

let a = new Array(200).fill(true);

构造定稿器

const cleanup = new FinalizationRegistry(key => {
  // your code here
});

cleanup.register(a, 'wewew');

对象'a'现在不可达,终结器回调将在垃圾收集后发生