【问题标题】:Javascript and Garbage collectionJavascript 和垃圾收集
【发布时间】:2013-09-14 09:46:30
【问题描述】:

有什么方法可以控制 Javascript 何时执行垃圾回收?我想让它在特定时间执行垃圾收集,以确保我的网站顺利运行

【问题讨论】:

标签: javascript garbage-collection


【解决方案1】:

Javascript 没有显式的内存管理,它是浏览器决定何时清理它。有时,由于垃圾收集暂停,您可能会遇到 JavaScript 渲染不流畅的情况。

您可以应用许多技术来克服由垃圾收集 (GC) 引起的故障。应用越多,探索越多。假设您有一个用 JavaScript 编写的游戏,并且您每秒钟都在创建一个新对象,那么很明显,在一定时间后,GC 会发生,为您的应用程序腾出更多空间。

对于像游戏这样需要大量空间的实时应用程序,您可以做的最简单的事情就是重复使用相同的内存。这取决于您如何构建代码。如果它产生大量垃圾,那么它可能会带来不稳定的体验。

通过简单的程序: 众所周知,new 关键字表示分配。只要有可能,您可以尝试通过添加或修改属性每次重用相同的对象。这也称为对象回收

在数组的情况下,分配 [] 通常用于清除数组,但您应该记住,它也会创建一个新数组并丢弃旧数组。要重用相同的块,您应该使用arr.length = 0 这具有相同的效果,但它重用了相同的数组对象而不是创建新的对象。

在函数的情况下:有时我们的程序需要使用 setInterval 或 setTimeout 调用特定函数的时间更长或在特定的时间间隔内。

ex: setTimeout(function() { doSomething() }, 10);

您可以通过将函数分配给永久变量而不是每次定期生成来优化上述代码。

    ex : var myfunc = function() { doSomething() }
    setTimeout(myfunc, 10);

其他可能的事情是,数组 slice() 方法返回一个新数组(基于原始数组中的范围,可以保持不变),字符串的 substr 也返回一个新字符串(基于原始字符串,可以保持不变),等等。如果没有正确地重用,调用这些函数会产生垃圾。

在 JavaScript 中完全避免垃圾是非常困难的,你可以说不可能。这取决于您如何重用对象和变量以避免垃圾。如果您的代码结构良好且经过优化,您可以最大限度地减少开销。

【讨论】:

  • 如果你打算做所有这些,用 C++ 编写游戏并通过 Emscripten 将其编译为 asm.js 会更好吗?无需担心 GC :)
【解决方案2】:

不幸的是,没有办法控制垃圾收集何时发生,但通过正确形成对象,您可以控制它发生的速度和干净程度。看看these documents on Mozilla Dev Net

该算法假定知道一组称为根的对象 (在 JavaScript 中,根是全局对象)。定期地, 垃圾收集器将从这些根开始,找到所有对象 从这些根引用,然后引用的所有对象 这些,等等。从根开始,垃圾收集器将因此 查找所有可达对象并收集所有不可达对象。

这个算法比前一个算法更好,因为“一个对象有 零引用”导致该对象无法访问。相反 正如我们在循环中看到的那样,这不是真的。

【讨论】:

    【解决方案3】:

    为什么不保留对所有对象的引用,直到您希望它们被 GC 处理?

    var delayed_gc_objects = [];
    function delayGC(obj) { // keeps reference alive
        return delayed_gc_objects[delayed_gc_objects.length] = obj;
    }
    function resumeGC() { // kills references, letting them be GCd
        delayed_gc_objects.length = 0;
    }
    

    【讨论】:

    • 这只会延迟回收(清扫),而不是可达性检查(跟踪),更不用说整个垃圾收集了。也就是说,只会让GC浪费时间。
    【解决方案4】:

    您可以执行一些更改来提高内存使用率,例如:

    1. 不要在循环中设置变量
    2. 避免使用全局变量和函数。在你出去之前,他们会占用一段记忆

    【讨论】:

      【解决方案5】:

      JavaScript 是一种垃圾收集语言,这意味着执行环境负责管理代码执行期间所需的内存。 JavaScript 最流行的垃圾收集形式称为标记和清除。 第二种不太流行的垃圾收集类型是引用计数。这个想法是每个值都会跟踪对其进行了多少引用

      GC遵循这些算法,即使你成功触发了GC,也不能保证它会立即运行,你只是标记它

      【讨论】:

      • 既然没有finalize,那没有标记的不是去掉了吗?
      【解决方案6】:

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

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

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

      2 - 做一些处理

      3 - 释放这个内存空间

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

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

      Mark-and-sweep 算法:将每个对象连接到根源。任何对象都不会连接到根或其他对象。此对象将被删除。

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

      【讨论】:

      • 我知道垃圾回收是什么。问题是如何控制这种情况何时发生。
      猜你喜欢
      • 2012-12-28
      • 2012-02-09
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2012-03-21
      • 2013-01-15
      • 1970-01-01
      相关资源
      最近更新 更多