有没有办法控制 JavaScript 执行垃圾回收的时机?我想在特定的时间启用垃圾回收,以确保我的网站顺畅运行。
有没有办法控制 JavaScript 执行垃圾回收的时机?我想在特定的时间启用垃圾回收,以确保我的网站顺畅运行。
Javascript没有显式的内存管理,是浏览器决定何时清理内存。有时候你可能会因为垃圾回收暂停而遇到JavaScript渲染不流畅的情况。
有许多技巧可以应用来克服由垃圾回收(GC)引起的故障。您应用越多,探索得就越多。假设您在JavaScript中编写了一个游戏,每秒钟都要创建一个新对象,那么显然在一定时间后将出现GC,以获得更多空间用于您的应用程序。
对于像需要大量空间的实时应用程序(如游戏)来说,你可以做的最简单的事情是重复使用相同的内存。这取决于您如何构造代码。如果它产生大量垃圾,则可能会给人带来不流畅的体验。
通过使用简单的过程:众所周知,new关键字表示分配。在可能的情况下,您可以尝试通过每次添加或修改属性来重复使用相同的对象。这也称为 对象的回收
在数组的情况下,赋值[]通常用于清除数组,但您应该记住它也会创建一个新数组并且垃圾旧数组。为了重复使用相同的块,您应该使用arr.length = 0
。这具有相同的效果,但它重复使用相同的数组对象而不是创建新对象。
在函数的情况下:有时我们的程序需要定期使用setInterval或setTimeout调用特定的函数。
ex: setTimeout(function() { doSomething() }, 10);
你可以通过将函数分配给永久变量而不是在常规间隔时间内每次生成来优化上述代码。
ex : var myfunc = function() { doSomething() }
setTimeout(myfunc, 10);
另一个可能的情况是,数组的slice()方法返回一个新的数组(基于原始数组中的一段范围,可以保持不变),字符串的substr也返回一个新的字符串(基于原始字符串中的一段字符范围,可以保持不变),等等。如果没有正确地重新利用这些函数调用,则会创建垃圾。
在JavaScript中完全避免垃圾非常困难,甚至可以说是不可能的。它取决于如何重复使用对象和变量以避免垃圾。如果您的代码结构良好且经过优化,可以最小化开销。
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;
}
您可以进行一些更改来改善内存使用,例如:
JavaScript 是一种垃圾回收语言,这意味着执行环境负责管理代码执行期间所需的内存。 JavaScript 最流行的垃圾回收形式称为标记和清除。 第二种不那么流行的垃圾回收方式是引用计数。其思想是每个值都跟踪了对它进行了多少个引用。
即使您设法触发了垃圾回收机制,也不能保证它会立即运行,只是将其标记。
垃圾回收(GC)是一种自动内存管理形式,通过移除不再需要的对象来实现。
任何处理内存的过程都遵循以下步骤:
1- 分配所需的内存空间
2- 进行一些处理
3- 释放该内存空间
有两种主要算法用于检测哪些对象不再需要。
引用计数垃圾收集:该算法将“对象不再需要”的定义缩减为“没有其他对象引用它”,如果没有引用指向该对象,则将其删除。
标记-清除算法:将每个对象连接到根源。任何未连接到根或其他对象的对象都将被删除。
目前,大多数现代浏览器使用第二种算法。