XmlHttpRequest具有大量数据的内存泄漏

时间:2019-04-01 11:56:54

标签: javascript google-chrome firefox

对于上下文,我尝试按需从HTTP服务器获取压缩的视频帧。我一直在努力解决内存泄漏问题。以功能要求的速度,浏览器每秒泄漏约50 MB。

通过以下简单代码复制:

<html>
  <head>
        <script>
          var frameCount = 200;
          var frameIndex = 0;
          var playTimer = null;
          var frameXhr = null;

          function requestFrame(){
          if (frameXhr===undefined || frameXhr===null){
          console.log("init req");
              frameXhr = new XMLHttpRequest();
              frameXhr.responseType = "arraybuffer";
              frameXhr.onload = null;

            }
            if (frameXhr.readyState != XMLHttpRequest.DONE && frameXhr.readyState != XMLHttpRequest.UNSENT){
              return;
            }
            frameXhr.open("GET", "frame"+((frameIndex++)%frameCount)+".data", true);
            //frameXhr.open("GET", "/seek?index="+((frameIndex++)%frameCount), true);
            frameXhr.send();
          }

          function startXhr(){
            playTimer = window.setInterval(requestFrame, 50);
          }

          function stopXhr(){
            window.clearInterval(playTimer);
          }
        </script>
  </head>
    <body>
        <h1>mstm test client</h1>
        <a href="#" onclick="startXhr()" >launch</a></br>
        <a href="#" onclick="stopXhr()" >stop</a></br>

    </body>
</html>

当我启动上面的startXhr()时,从HTTP请求接收的所有数据似乎都保留在内存中,直到我重新加载页面为止。

每个帧大约2MB,请求通常需要大约20毫秒才能完成。 这是我做过的一些实验:

  • 如果我请求相同的3个帧而不是迭代200个以上不同的帧,则泄漏减少到0.5 MB,但没有消失(例如,将frameCount更改为3)。

  • 如果为不同的请求提供了相同的三个帧,则结果与上述相同(因此,根据请求似乎没有任何缓存)。

  • 无论是提供文件中的帧还是内存中计算的帧,泄漏都不会改变。

  • 如果我使用python示例HTTP服务器而不是C ++ HTTP服务器(基于著名的库)来提供文件,则会观察到相同的效果。
  • 如果我降低请求率,则泄漏的时间会相应减少。
  • 如果我减少每个请求中传输的数据量,泄漏也会按比例减少。
  • 泄漏是在Chrome和Firefox上重现的,而不是Edge(在Windows 10,Chrome 73和Firefox 62上经过测试)。

我在简单的复制代码中没有犯任何错误吗?你们中的任何一个重现问题吗?我是在尝试使浏览器脱离舒适区域,还是一个真正的错误?

0 个答案:

没有答案