Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何清除Javascript中的内存?_Javascript_Memory - Fatal编程技术网

如何清除Javascript中的内存?

如何清除Javascript中的内存?,javascript,memory,Javascript,Memory,var Obj=function(){};var X=新的Obj() X=null会正确清除内存吗 这也会是同等的吗 var Obj = function(){}; var X = {}; X.obj = new Obj(); delete(X.obj); 编辑 看起来,尽管删除X.obj不会立即清除内存,但它有助于垃圾收集。如果我不删除X.obj,仍然会有一个指向对象的指针,因此GC可能不会清理它 虽然我选择了@delnan的答案,但如果你正在读这篇文章,你应该也能看到Benub

var Obj=function(){};var X=新的Obj()

X=null
会正确清除内存吗

这也会是同等的吗

var Obj = function(){}; 
var X   = {}; 
X.obj   = new Obj();
delete(X.obj);
编辑 看起来,尽管删除X.obj不会立即清除内存,但它有助于垃圾收集。如果我不删除X.obj,仍然会有一个指向对象的指针,因此GC可能不会清理它

虽然我选择了@delnan的答案,但如果你正在读这篇文章,你应该也能看到Benubird的文章


我还注意到我无意中最初编写了delete(X)而不是delete(X.obj)-对不起。

否-Javascript会在需要时运行GC。

否,这不会清除内存

请阅读以下内容:


简单的回答是,你没有
delete
只是删除一个引用(而不是以您尝试使用它的方式,请参见上面的链接-
delete
是很少有人真正理解的语言功能之一),仅此而已。该实现为您清除内存,但它在什么时候(严格来说,即使如此——这就是为什么不应该依赖GC的d语言中提供它们的终结器)清除内存,这与您无关。但请注意:

  • 只有被证明无法访问(即无法访问)所有代码的对象才能被删除。保持对谁的引用通常是相当明显的,至少在概念上是这样。在处理大量闭包时,您只需小心,因为它们可能会捕获比您想象的更多的变量。还请注意,循环引用已正确清理
  • 旧(但遗憾的是仍然使用)IE版本中存在一个bug,涉及JS事件处理程序和DOM元素的垃圾收集。谷歌(或许是这样)应该在我的记忆中有更好的素材

有利的一面是,这意味着您不会出现悬空指针错误或(当然,除了上述缺陷)内存泄漏。

Delete方法只删除引用,而不是对象。任何其他引用都将被保留在等待垃圾收集器的公开位置

JavaScript有自己的GC,当不再有任何东西引用它们时,它将运行并清理它们

我仍然认为空对象是一个很好的实践。 删除一个对象也有助于GC,因为它会看到一些悬空的东西,并说“我要吃了你,因为你独自一人(现在有些愤世嫉俗的笑声)”

你应该看看


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

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

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

不过,有一些事情需要注意——在JS中很容易创建循环引用,特别是在DOM元素和对象之间。必须注意清除(或不首先创建)对象中对DOM元素的引用和/或从DOM元素中的引用。如果确实创建了与DOM相关的to/from引用,请确保通过将对象和DOM元素上的引用都设置为null来显式清理它们。如果存在对DOM或localStorage的引用的子对象,则仅将父对象设置为null是不够的,因为这些引用将继续存在;如果存在从子对象到父对象的任何引用,则父对象将由于该引用而继续存在于内存中

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


一篇关于主题的文章:,另一个详细的外观:

那么在上面的代码示例中,新的Obj()是否会通过垃圾收集从内存中删除,因为不再指向它?在第一个片段之后,创建的对象不再被引用,因此可以被收集。第二个错误使用了
delete
(参见Benubird的链接),结果取决于实现是否允许删除变量,但如果允许,则没有剩余的引用。否则,一旦
X
超出范围,对象就会被垃圾收集。不管是哪种方式,在对象无法访问之后(不是立即,除非是难以置信的偶然),内存在某个时间点被释放。我只是注意到我在代码片段中输入了一个错误。我的意思是删除(X.obj)。那么,我应该删除(X.obj)或X.obj=null来加速GC吗?两者都不是,除非您已经证明引用保留时间过长存在问题(正如Kris Kause所说,GC本身工作得很好)。在这种情况下,两种方法都同样有效——你把它处理掉,这才是最重要的。处理
null
undefined
需要更多的代码,因此您可能希望坚持使用一个。实际上,我从未发现自己处于需要将全局变量设置为null的情况下。。。只是对象属性(比如我有一个对象集合,想要删除其中一个指针)。所以实际上我可以坚持使用delete(X.obj)。虽然这很好地澄清了这两个案例的作用