什么是JavaScript垃圾收集?对于web程序员来说,为了写出更好的代码,理解JavaScript垃圾回收有什么重要的?
发布于 2009-05-14 17:05:55
当涉及到DOM对象时,要注意循环引用:
Memory leak patterns in JavaScript
请记住,只有当没有对对象的活动引用时,才能回收内存。这是闭包和事件处理程序的常见缺陷,因为一些JS引擎不会检查内部函数中实际引用了哪些变量,而只是保留封闭函数的所有局部变量。
下面是一个简单的例子:
function init() {
var bigString = new Array(1000).join('xxx');
var foo = document.getElementById('foo');
foo.onclick = function() {
// this might create a closure over `bigString`,
// even if `bigString` isn't referenced anywhere!
};
}
只要事件处理程序还在,一个简单的JS实现就不能收集bigString
。有几种方法可以解决这个问题,例如在init()
的末尾设置bigString = null
(delete
不适用于局部变量和函数参数:delete
从对象中移除属性,并且变量对象是不可访问的-如果您试图删除局部变量,严格模式下的ES5甚至会抛出ReferenceError
!)。
如果您关心内存消耗,我建议尽可能避免不必要的闭包。
发布于 2009-05-14 17:06:14
摘自博客中的一句名言
DOM组件和JScript组件一样都是“垃圾收集”的,这意味着如果您在任一组件中创建了一个对象,然后丢失了对该对象的跟踪,它最终将被清除。
例如:
function makeABigObject() {
var bigArray = new Array(20000);
}
调用该函数时,JScript组件将创建一个可在该函数中访问的对象(名为bigArray)。但是,一旦函数返回,您就会“失去对bigArray的跟踪”,因为无法再引用它。那么,JScript组件意识到您已经失去了它的踪迹,因此清理了bigArray --回收了它的内存。同样的事情也适用于DOM组件。如果您说document.createElement('div')
或类似的内容,那么DOM组件将为您创建一个对象。一旦您以某种方式丢失了对该对象的跟踪,DOM组件将清理相关的。
发布于 2009-05-14 17:08:16
据我所知,当没有对JavaScript对象的引用时,JavaScript的对象会定期被垃圾回收。这是自动发生的事情,但是如果您想更多地了解它是如何工作的,那么在C++级别上看一下WebKit或V8 source code是有意义的
通常你不需要考虑这一点,然而,在更老的浏览器中,比如IE5.5和IE6的早期版本,也许在当前版本中,闭包会创建循环引用,如果不选中它,最终会消耗内存。在我所说的关于闭包的特殊情况下,是在向dom对象添加JavaScript引用,以及向DOM对象添加回引用JavaScript对象的对象时。基本上,它永远不会被收集,最终会导致操作系统在测试应用程序中变得不稳定,从而导致崩溃。实际上,这些泄漏通常很小,但是为了保持代码的整洁,您应该删除对DOM对象的JavaScript引用。
通常,使用delete关键字来立即解除对大型对象的引用是一个好主意,特别是在移动web开发中。这会导致GC的下一次扫描删除该对象并释放其内存。
https://stackoverflow.com/questions/864516
复制相似问题