47

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

4

6 回答 6

80

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

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

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

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

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

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

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

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

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

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

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

于 2013-09-20T09:48:56.420 回答
5

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

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

这个算法比前一个算法更好,因为“一个对象的引用为零”会导致这个对象无法访问。正如我们在周期中看到的那样,相反的情况并非如此。

于 2013-09-14T09:51:49.687 回答
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;
}
于 2013-09-14T10:04:22.937 回答
0

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

  1. 不要在循环中设置变量
  2. 避免使用全局变量和函数。他们会带走一段记忆,直到你出去
于 2013-09-23T01:43:39.373 回答
0

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

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

于 2013-09-23T08:16:21.743 回答
-3

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

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

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

2 - 做一些处理

3 - 释放这个内存空间

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

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

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

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

于 2015-04-05T13:59:05.047 回答