有什么方法可以控制Javascript何时执行垃圾回收?我想让它在某些时候执行垃圾收集,以确保我的网站顺利运行
答案 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)
您可以执行一些更改以改善内存使用,例如:
答案 4 :(得分:0)
JavaScript是一种垃圾收集语言,这意味着执行环境负责管理代码执行期间所需的内存。 JavaScript最流行的垃圾收集形式称为标记和扫描。 第二种不太流行的垃圾收集类型是引用计数。我们的想法是每个值都跟踪对它的引用数量
GC遵循这些算法,即使您设法触发GC,也不能保证它会立即运行,您只是标记它
答案 5 :(得分:-3)
垃圾收集(GC)是一种通过删除不再需要的对象来自动进行内存管理的一种形式。
处理内存的任何进程都遵循以下步骤:
1 - 分配您需要的内存空间
2 - 做一些处理
3 - 释放这个记忆空间
有两种主要算法用于检测不再需要的对象。
引用计数垃圾收集:此算法减少了&#34的定义;不再需要对象" to"一个对象没有引用它的其他对象"如果没有引用它就会删除该对象
标记和扫描算法:将每个对象连接到根源。任何对象都不能连接到root或其他对象。该对象将被删除。
目前大多数现代浏览器使用第二种算法。