Javascript 和垃圾收集

IT技术 javascript garbage-collection
2021-03-16 11:01:38

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

6个回答

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

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

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

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

在 Arrays 的情况下,赋值 [] 通常用于清除数组,但您应该记住,它还会创建一个新数组并清除旧数组。要重用相同的块,您应该使用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 :)
2021-05-07 11:01:38

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

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

该算法比前一个算法更好,因为“对象具有零引用”导致该对象无法访问。正如我们在循环中看到的那样,情况并非如此。

为什么不保留对所有对象的引用,直到您希望它们被 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 浪费时间。
2021-04-24 11:01:38

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

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

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

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

既然没有finalize,那些没有标记的不是去掉了吗?
2021-05-09 11:01:38