JavaScript和垃圾收集

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

垃圾收集在JavaScript参考

Javascript没有明确的内存冗余,它是决定何时清理它的浏览器。 有时可能会发生这样的情况,即由于垃圾收集暂停,您会遇到JavaScript不stream畅的呈现。

有很多技术可以用来克服垃圾收集(GC)引起的故障。 更多你申请更多你探索。 假设你有一个用JavaScript编写的游戏,并且每一秒你都在创build一个新的对象,那么很明显,在一段时间之后,GC将会出现,为你的应用程序创造更多的空间。

对于需要大量空间的游戏等实时应用,最简单的方法就是重复使用相同的内存。 这取决于你如何构build你的代码。 如果它产生大量的垃圾,那么它可能会带来不稳定的体验。

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

在数组的情况下,通常使用赋值[]来清除数组,但是您应该记住,它也会创build一个新数组,并且会对旧数组进行垃圾处理。 要重复使用相同的块,应该使用arr.length = 0这样做的效果相同,但它重用相同的数组对象,而不是创build新的对象。

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

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

您可以通过将函数分配给一个永久variables来优化上面的代码,而不是每隔一段时间产生一次。

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

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

为了避免垃圾完全在JavaScript中是非常困难的,你可以说是不可能的。 它取决于你如何重用对象和variables来避免垃圾。 如果你的代码结构合理,优化,你可以尽量减less开销。

不幸的是,没有办法控制什么时候垃圾收集发生,但有了适当的物体形成,你可以控制它发生的速度和干净程度。 在Mozilla开发者networking上查看这些文档 。

这个algorithm假定知道一组被称为根的对象(在JavaScript中,根是全局对象)。 垃圾收集器将定期从这些根开始,find从这些根引用的所有对象,然后从这些根引用所有对象,等等。从根开始,垃圾收集器将查找所有可到达的对象,可到达的对象。

这个algorithm比前一个algorithm更好,因为“一个对象有零引用”导致这个对象无法访问。 正如我们已经看到周期一样,情况正好相反。

为什么不保持对所有对象的引用,直到你想让它们成为GC'd?

 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; } 

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

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

JavaScript是一种垃圾收集语言,这意味着执行环境负责pipe理代码执行过程中所需的内存。 JavaScript中最stream行的垃圾收集forms叫做“标记扫描”。 第二种不太受欢迎的垃圾收集types是参考计数。 这个想法是,每个值跟踪有多less参考

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

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

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

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

2 – 做一些处理

3 – 释放这个内存空间

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

引用计数垃圾回收:该algorithm将“不再需要对象”的定义降低为“没有其他对象引用对象”的定义,如果没有引用对象,则该对象将被移除

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

目前最现代的浏览器使用第二种algorithm。