javascript - 为什么这段代码正在消耗内存并且没有被完全回收?

标签 javascript garbage-collection xmlhttprequest

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

  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 毫秒(通常约为 7-10 毫秒)。

在长时间运行中,内存图看起来像这样 Initial memory consumption graph

编辑 一个小时工作后的同一个 Chrome 窗口 Graph after a hour of work

编辑 从长远来看(数小时),并非所有内存都被回收,图表仍在上升。 我明白为什么内存被消耗了,我不明白为什么它没有完全回收

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

  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。

最佳答案

对于一个你重复加载json.txt的内容,这将需要一些内存。除此之外,XHR 本身可能也需要一些内存。不过,我认为这不是什么大问题,因为内存似乎无论如何都会被回收。

关于javascript - 为什么这段代码正在消耗内存并且没有被完全回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659645/

相关文章:

javascript - 单击按钮时在 Bootstraps 移动导航上打开子菜单

javascript - 我需要 React Router V5 中的嵌套路由

c# - 从终结器处理时,只读字段变为空

javascript - 如何在 JavaScript 的 REST API 调用中进行 http 身份验证

php - 使用 dropzone 将附加数据发送到后端

javascript - 如何创建基于位置哈希的网络应用程序

javascript - 移除类不起作用

java - 大量内存泄漏导致堆大小在大约8秒内从大约64mb变为1.5gb。垃圾收集器有问题吗?

r - 垃圾收集器会在tryCatch语句的替代表达式中释放变量吗?

javascript - 来自 xhr 循环中的多个 onprogress 事件处理程序