Javascript和垃圾收集

时间:2013-09-14 09:46:31

标签: javascript garbage-collection

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

6 个答案:

答案 0 :(得分:74)

Javascript没有明确的内存管理,它是决定何时清理它的浏览器。有时,由于垃圾收集暂停,您可能会遇到JavaScript的不流畅呈现。

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

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

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

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

如果是函数:有时我们的程序需要使用setInterval或setTimeout更多时间或某些时间间隔调用特定函数。

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

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

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

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

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

答案 1 :(得分:5)

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

  

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

     

这个算法优于前一个算法,因为“一个对象有   零参考“导致此对象无法访问。相反   我们在周期中看到的情况并非如此。

答案 2 :(得分:2)

为什么不保留对所有对象的引用,直到您想要它们为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;
}

答案 3 :(得分:0)

您可以执行一些更改以改善内存使用,例如:

  1. 不要在循环上设置变量
  2. 避免使用全局变量和函数。他们会留下一块记忆直到你出去

答案 4 :(得分:0)

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

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

答案 5 :(得分:-3)

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

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

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

2 - 做一些处理

3 - 释放这个记忆空间

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

引用计数垃圾收集:此算法减少了&#34的定义;不再需要对象" to"一个对象没有引用它的其他对象"如果没有引用它就会删除该对象

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

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