首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这段代码占用内存而它没有被完全回收?

为什么这段代码占用内存而它没有被完全回收?
EN

Stack Overflow用户
提问于 2011-04-14 06:56:18
回答 5查看 504关注 0票数 3

我有一个简单的JavaScript代码,它在无限运行时消耗内存。内存消耗由Google内部内存分析器监控。

代码语言:javascript
复制
  setInterval(function(){
     var xhr = new XMLHttpRequest();
     xhr.open('GET', 'json.txt', true);
     xhr.onreadystatechange = function() {
        if(this.readyState == 4 && this.status == 200) {
           console.log(this.responseText);
        }
     };
     xhr.send('');
  }, 500);

具有上述代码示例和json.txt的Html托管在我的本地服务器上,获取一个文件所花费的时间不超过500 is (总是7-10 is )。

在很长一段时间内,内存图是这样的。

工作一小时后,编辑相同的Chrome窗口

编辑的长期运行(小时),不是所有的内存被回收,一个图表仍在上升。我理解为什么内存被消耗,我不明白为什么没有完全回收

编辑这就是我可以减少内存泄漏的方法

代码语言:javascript
复制
  var callback = function(){
      if(this.readyState == 4 && this.status == 200) {
          console.log(this.responseText);
      }
  } 

  setInterval(function(){
     var xhr = new XMLHttpRequest();
     xhr.open('GET', 'json.txt', true);
     xhr.onreadystatechange = callback;
     xhr.send('');
  }, 500);

这一改进允许不将回调的闭包链接到xhr var。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-20 01:20:59

我想这个间隔不是在真空中设定的。要传递给setInterval的函数可以访问在其中定义的词法作用域。这意味着它周围的每个变量在垃圾收集器眼中都是可访问的,即使在函数中没有使用这些变量。垃圾收集器永远不会把它清理干净。在更卫生的环境中定义函数可能会更好,因为在这个环境中,函数将无法访问任何大小较大的变量。

编辑:对不起,我会尽量让自己更清楚。这与XHR无关--您可以在该setInterval函数中放置任何东西(甚至是任何东西),如果它的词法作用域中存在一些您希望清理的变量,它仍然会泄漏。您只需要确保setInterval函数没有对任何要清理的变量的闭包访问。例如:

代码语言:javascript
复制
(function() {
  var a = readFile('a-very-big-file.txt');

  setInterval(function() {
    console.log('im leaking!');
  }, 500);
})();

会漏水的。尽管setInterval没有做任何特别有意义的事情,但它仍然可以访问"a",垃圾收集器认为它是可访问的。

票数 0
EN

Stack Overflow用户

发布于 2011-04-14 07:01:58

首先,您重复加载json.txt的内容,这将需要一些内存。除此之外,XHR本身也可能需要一些内存。不过,我不认为这有多大的问题,因为内存似乎被回收了。

票数 6
EN

Stack Overflow用户

发布于 2011-04-14 07:03:17

为什么不应该呢?至少var xhr =新的XMLHttpRequest();必须在每次迭代时消耗内存,并由GC收集(可能,在图表中可以看到)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5659645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档