Утечка памяти XmlHttpRequest с большим объемом данных - PullRequest
0 голосов
/ 01 апреля 2019

Для контекста я пытаюсь получить сжатые видеокадры по запросу с HTTP-сервера.Я боролся с утечкой памяти.При требуемой функциональности скорость браузера составляет около 50 МБ в секунду.

Воспроизводится с помощью следующего простого кода:

<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-запроса, по-видимому, остаются в памяти до тех пор, пока я не перезагружу страницу.

Каждый кадр занимает около 2 МБ, выполнение запроса обычно занимает около 20 мс.Вот несколько экспериментов, которые я провел:

  • Если я запрашиваю одни и те же 3 кадра вместо итерации по 200 различным кадрам, утечка уменьшается до 0,5 МБ, но не исчезает (изменить frameCountнапример, до 3).

  • Если те же три кадра обслуживаются по разному запросу, результат такой же, как и выше (поэтому, похоже, что кеширование не основано на запросе).).

  • Утечка не зависит от того, обслуживаю ли я кадры из файлов или кадры, которые вычисляются в памяти.

  • Если я использую пример PythonHTTP-сервер для обслуживания файлов вместо моего C ++ HTTP-сервера (на основе известной библиотеки) наблюдаются те же эффекты.
  • Если я уменьшу частоту запросов, утечки пропорционально уменьшатся во времени.
  • Если я уменьшу количество данных, передаваемых в каждом запросе, утечка также будет пропорционально уменьшена.
  • Утечка воспроизводится в Chrome и Firefox, но не в Edge (протестировано в Windows 10, Chrome 73 и Firefox 62).

Я допустил какую-либо ошибку в своем простом коде воспроизведения?Кто-нибудь из вас воспроизводит проблему?Я пытаюсь вывести браузер из зоны комфорта или это настоящая ошибка?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...