Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.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_Jquery_Memory Leaks - Fatal编程技术网

JavaScript对象的生命&;内存渗漏体

JavaScript对象的生命&;内存渗漏体,javascript,jquery,memory-leaks,Javascript,Jquery,Memory Leaks,我对此做了不少研究,但主要是将其他问题拼凑在一起,这仍然留下一些疑问。如果应用程序在任何时候都不会刷新浏览器页面,并且可能会在不关闭的情况下运行很长一段时间(数小时)(假设刷新页面或导航到另一个页面会重新启动js代码),那么确保对象被释放并且没有内存泄漏的最佳方法是什么 以下是我关注的具体场景: 下面的所有代码都在显示模块模式中 mycode = function(){}() 函数中的变量,我确信这一个是由GC收集的 function(){ var h = "ss";} 模块中的变量,当不再

我对此做了不少研究,但主要是将其他问题拼凑在一起,这仍然留下一些疑问。如果应用程序在任何时候都不会刷新浏览器页面,并且可能会在不关闭的情况下运行很长一段时间(数小时)(假设刷新页面或导航到另一个页面会重新启动js代码),那么确保对象被释放并且没有内存泄漏的最佳方法是什么

以下是我关注的具体场景:

下面的所有代码都在显示模块模式中

mycode = function(){}()
函数中的变量,我确信这一个是由GC收集的

function(){ var h = "ss";}
模块中的变量,当不再需要时g=null吗

var g;
function(){ g = "dd";}
最后是jqXHR的生命:它回来后会被清理干净吗?是否应在所有情况下将其设置为null作为预防措施,无论是保存在函数还是模块中

如果执行此操作,它是否在返回后由GC清理

function(){
   var x = $.get();
   x.done = ...;
   x.fail = ...;
}
var x;
function(){
   x = $.get();
   x.done = ...;
   x.fail = ...;
}
进行此操作时,x返回后是否也会进行清理

function(){
   var x = $.get();
   x.done = ...;
   x.fail = ...;
}
var x;
function(){
   x = $.get();
   x.done = ...;
   x.fail = ...;
}

最后,有没有一种方法可以在不重新启动浏览器的情况下清理所有变量并重新启动模块?

Javascript是一种垃圾收集语言。它依赖于垃圾收集器来清理未使用的内存。因此,本质上,您必须相信GC会完成它的工作

GC将(最终,不一定立即)收集您无法访问的对象。如果您有一个对象的引用,那么它可能仍在使用中,因此GC不会接触它

如果您没有直接或间接地引用该对象,那么GC知道该对象不可能被使用,并且可以收集该对象。因此,实际上,您所要做的就是确保重置对对象的任何引用


但是,GC不保证何时收集对象。你不必担心这一点。

实际上,你应该担心的唯一泄漏是关闭

function foo(a){
    var b = 10 + a;
    return function(c){
        return b + c;
    }
}

var bar = foo(20);
var baz = bar(5);
GC无法删除
var b
-它超出范围。这是IE的一个大问题,与Mozilla相比,更不用说Chrome了

函数中的变量,我确信这一个是由GC收集的

function(){ var h = "ss";}

模块中的变量,当不再需要时g=null吗

var g;
function(){ g = "dd";}
当然

最后是jqXHR的生命:它回来后会被清理干净吗?是否应在所有情况下将其设置为null作为预防措施,无论是保存在函数还是模块中

各种浏览器都有与XHR相关的bug,导致
onreadystatechange
和它关闭的任何东西都无法收集,除非开发人员小心地用一个伪值(
XHR.onreadystatechange=new Function(“”)
)替换它,但我相信jQuery会为您处理这个问题

最后,是否有一种方法可以清除所有变量并在不重新启动浏览器的情况下重新启动模块

与页面关联的全局状态将占用浏览器内存,直到页面从浏览器历史堆栈中退出。可以帮助您在不扩展历史堆栈的情况下删除当前页面并用同一应用程序的新版本替换它

将当前文档替换为所提供URL处的文档。与
assign()
方法的区别在于,使用
replace()
后,当前页面将不会保存在会话历史记录中,这意味着用户将无法使用后退按钮导航到它

当您使用单词“module”时,对于浏览器或其JavaScript解释器来说,这不是一个定义明确的术语,因此无法从内存中逐出模块,只能从内存中逐出模块。有几件事你必须担心,这可能会让你记忆犹新:

  • 对已附加到DOM节点的JavaScript对象的引用以及它们关闭的所有对象——事件处理程序是一个非常常见的示例
  • 实时
    setInterval
    setTimeout
    回调以及它们关闭的所有内容
  • 全局对象及其关闭的所有对象的属性
  • 正如您所注意到的,某些主机对象的属性,如XHR实例、web worker回调等,以及(您猜对了)它们关闭的所有内容

  • 任何要卸载模块且仅卸载模块的方案都需要处理所有这些问题,并找出其中哪些是模块的一部分,哪些不是。这是许多不同类型的清理。

    是第一个使用“g”的示例,g应设置为null。否则,它将保留指向“dd”的指针


    在第二个示例中,第一种情况下的“x”不需要设置为null,因为当周围函数退出时,该变量将“消失”。在第二种情况下,如果“x”在函数外部,“x”将保留分配给它的任何内容,并且在“x”设置为null或其他值之前,不会对其进行GC。

    GC可以收集您无法再访问的每个变量。如果在函数中声明变量,一旦函数退出,就可以删除该变量。它是,当计算机内存不足时,或在任何其他时间

    当您执行像XHR这样的异步函数时,这会变得更加复杂。done和fail闭包可以访问外部函数中声明的所有变量。因此,只要可以执行done和fail,所有变量都必须保留在内存中。一旦请求完成,就可以释放变量


    无论如何,您只需确保每个变量都声明得尽可能深。

    作为任何垃圾收集语言的经验法则(例如,这适用于Java、.NET和JavaScript),您要做的是确保没有对希望GC为您清理的内存块的延迟引用。当GC查看一个内存块并发现程序中仍有引用它的内容时,它