你如何清除Javascript中的内存?

时间:2011-08-30 18:40:59

标签: javascript memory

var Obj = function(){}; var X = new Obj();

X = null会正确清除记忆吗?

这也是等同的吗?

var Obj = function(){}; 
var X   = {}; 
X.obj   = new Obj();
delete(X.obj);

修改 虽然删除X.obj似乎不会立即清除内存,但它似乎有助于垃圾收集。如果我不删除X.obj,仍然会有一个指向对象的指针,因此GC可能无法清除它。

虽然我正在接受@ delnan的答案,如果你正在阅读这篇文章,你也应该去找Benubird的文章。

我还注意到我不小心写了删除(X)而不是删除(X.obj) - 对不起。

6 个答案:

答案 0 :(得分:18)

简短的回答是你没有。 delete只是删除了一个引用(而不是您尝试使用它的方式,请参阅上面的链接 - delete是很少有人真正了解的语言功能之一),仅此而已。实现为您清除了内存,但是当它(并且严格地说 - 这就是为什么人们不应该依赖于提供它们的GC语言中的终结器)时,这不是您的业务。请注意:

  • 只能删除所有可以证明无法访问(即无法访问)所有代码的对象。从概念上讲,通常相当明显的是对谁的引用。你只需要注意何时处理大量的闭包,因为它们可能会捕获比你想象的更多的变量。另请注意,正确清理循环引用
  • 旧版(但遗憾地仍然使用)IE版本中存在一个错误,涉及JS事件处理程序和DOM元素的垃圾收集。谷歌(甚至可能是SO)应该有更好的记忆材料。

从好的方面来说,这意味着你不会得到悬挂的指针错误或(当然除了上述陷阱)内存泄漏。

答案 1 :(得分:15)

答案 2 :(得分:4)

否 - Javascript在感觉就像运行GC一样。

答案 3 :(得分:3)

Delete方法只删除引用 - 而不是对象。任何其他引用都将在打开时等待垃圾收集器。

JavaScript有自己的GC,当没有任何内容引用时,它会运行并清理它们。

我仍然认为将对象置空是一个好习惯。 删除一个对象也有助于GC,因为它会看到晃来晃去的东西,然后说“我要吃你,因为你一个人(现在有些玩世不恭的笑)”。

您应该查看Deleting Objects in JavaScript

即使有GC,您仍然希望确保您的脚本针对性能进行了优化,因为人们的计算机,浏览器和fricken工具栏(以及它们的数量)会有所不同。

答案 4 :(得分:1)

一般来说,Javascript中的内存管理是特定于用户代理的。垃圾收集器的基础是通过引用计数。因此,通过设置null引用(使用delete关键字或通过显式赋值),您可以确保自己清理引用, IF 对象没有任何引用这将超出它的创造范围。既然如此,GC就已经清理了范围已经结束的任何对象或变量,而没有明确地将其设置为null。

但是有一些事情要处理 - 循环引用很容易在JS中创建,特别是在DOM元素和对象之间。必须注意清除(或不首先创建)对象内DOM元素的引用和/或来自DOM元素的引用。如果您确实创建了一个与DOM相关的to / from引用,请确保通过在对象和DOM元素上设置null引用来显式清除它们。如果存在引用/来自DOM或localStorage的子对象,那么简单地将父对象设置为null是不够的,因为这些引用将继续存在,并且如果从子进程到父进程有任何引用,则父对象将继续存在记忆因为那个参考。

网页实际上可以通过这种方式泄漏内存中的垃圾 - 在您离开之后,循环引用会将对象和DOM元素保留在内存中,直到您重新启动浏览器为止!

有关此主题的文章:http://docstore.mik.ua/orelly/webprog/jscript/ch11_03.htm,另有详细说明:http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx

答案 5 :(得分:0)

JavaScript内存通常与Java类似地处理 - 我的意思是存在(或应该存在)垃圾收集器,如果没有对它的引用,它将删除该对象。所以是的,简单地“无效”引用是你应该“处理”释放内存的唯一方法,真正的释放是JS主机部分。