Для контекста я пытаюсь получить сжатые видеокадры по запросу с 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).
Я допустил какую-либо ошибку в своем простом коде воспроизведения?Кто-нибудь из вас воспроизводит проблему?Я пытаюсь вывести браузер из зоны комфорта или это настоящая ошибка?