2011-08-30 121 views
17

var Obj = function(){}; var X = new Obj();如何清除Javascript中的内存?

X = null正确清晰的记忆?

这也是等同的吗?

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

编辑 这似乎是,虽然删除X.obj不会立即清晰的记忆,这将有助于垃圾收集。如果我不删除X.obj,那么仍然会有一个指向对象的指针,因此GC可能无法清除它。

虽然我正在采摘@ delnan的答案,如果您正在阅读本文,您应该确定也可以阅读Benubird的文章。

我也注意到我不小心写了删除(X)本来而不是删除(X.obj) - 抱歉。

+0

你应该解释为什么你有兴趣在“清除记忆”。它是为了减少内存使用量吗?或为了安全?或者其他原因? –

+0

为了减少RAM使用/确保GC命中它 –

+0

我喜欢这个问题。不幸的是,与大多数内存管理环境一样,最好的方法是让GC完成它的工作。哦,看着参考。 –

回答

15

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

  • 只能删除可证明无法访问(即无法访问它)所有代码的对象。什么引用谁通常相当明显,至少在概念上。在处理大量关闭时,您只需要小心,因为它们可能会捕获比您想象的更多的变量。还请注意,通知正在清理正确
  • 在涉及JS事件处理程序和DOM元素的垃圾收集的旧版本(但可悲的仍然使用)的IE版本中存在一个错误。 Google(也许甚至是SO)应该在我的记忆中拥有更好的材料。

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

+0

因此在上面的代码示例中,wouldn'新的Obj()通过垃圾收集从内存中删除,因为没有指向它了? –

+0

在第一个片段之后,创建的对象不再被引用,因此可以收集。第二个错误使用'delete'(请参阅Benubird的链接),结果取决于实现是否允许删除变量,但如果是,则没有参考剩余。否则,只要'X'超出范围,对象就会变成垃圾回收。无论哪种方式,在对象无法再到达之后,在某个时间点之后,内存被释放(不是直接的,除非通过难以置信的机会)。 – delnan

+0

我刚刚注意到我在我的代码段中犯了一个错字。我的意思是把删除(X.obj)。那么我应该删除(X.obj)还是X.obj = null来加速GC? –

3

否 - Javascript运行GC时感觉就像它。

2

删除方法只删除引用 - 不是对象。任何其他的引用都会在等待垃圾收集器的时候被忽略。

JavaScript有它自己的GC,它会在没有任何东西指向它们时运行并清理它们。

我仍然认为这是一个很好的做法,以null对象。 删除对象也有助于GC,因为它会看到悬挂的东西,并说“我要吃掉你,因为你们都是孤独的(现在有些玩世不恭的笑)”。

你应该看看Deleting Objects in JavaScript

即使有一个GC,你还是要确保你的脚本性能为人民的电脑,浏览器和fricken工具栏(和它们的数量)进行了优化,可能会有所不同。

0

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

1

一般来说,Javascript中的内存管理是用户代理特定的。垃圾收集器的基础知识是通过引用计数。因此,通过将参考设置为空(使用delete关键字或通过明确分配),可以确保清除参考,IF该对象没有任何超出其创建范围的引用。在这种情况下,GC将已经清除了范围已经结束的任何对象或变量,而未明确将其设置为null。

尽管有些事情需要注意,循环引用很容易在JS中创建,特别是在DOM元素和对象之间。必须注意清除(或不首先创建)对象内DOM元素的引用。如果您确实创建了与DOM有关的to/from引用,请确保通过将引用设置为null(无论是在对象还是在DOM元素上)来显式清除它们。如果有子对象引用/从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