对于上下文,我尝试按需从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)。
如果为不同的请求提供了相同的三个帧,则结果与上述相同(因此,根据请求似乎没有任何缓存)。
无论是提供文件中的帧还是内存中计算的帧,泄漏都不会改变。
我在简单的复制代码中没有犯任何错误吗?你们中的任何一个重现问题吗?我是在尝试使浏览器脱离舒适区域,还是一个真正的错误?