Javascript 浏览器在消耗大量内存后创建图像Blob的ObjectURL时出错

Javascript 浏览器在消耗大量内存后创建图像Blob的ObjectURL时出错,javascript,html,memory,websocket,blob,Javascript,Html,Memory,Websocket,Blob,嗯,我在编程一个通过WebSocket从服务器接收图像的Web应用程序时遇到了一个奇怪的错误。服务器每秒向浏览器发送大约8个图像(.bmp)。每个图像的大小约为300KB。这大约是2.4Mbps 浏览器以二进制blob的形式接收图像: //WebSocket var ws = new WebSocket("ws://192.168.0.10:1337"); //Image var camImg = new Image(); ws.onmessage = function(msg) {

嗯,我在编程一个通过WebSocket从服务器接收图像的Web应用程序时遇到了一个奇怪的错误。服务器每秒向浏览器发送大约8个图像(.bmp)。每个图像的大小约为300KB。这大约是2.4Mbps

浏览器以二进制blob的形式接收图像:

//WebSocket
var ws = new WebSocket("ws://192.168.0.10:1337");
//Image
var camImg = new Image();

ws.onmessage = function(msg)
{
    var data = msg.data;
    // handle binary messages from server
    if (data instanceof Blob) camImg.src = window.URL.createObjectURL(data);
};

camImg.onload = function()
{
    //draw image to canvas
    canvasCont2D.drawImage(this,0,0);
    //request next frame
    ws.send("give me the next image!");
    //delete ObjectURL
    window.URL.revokeObjectURL(this.src);
};
因此,在这一点之前,一切都很顺利。现在我来回答第一个问题: 当我在Chrome上进行测试时,我观察了TaskManager,以了解这种编码需要多少资源。我看到有一个Chrome进程启动时的内存约为90MB。每秒增加2.4MB。看来我收到的每一张照片都会留在记忆中。有没有可能防止这种情况发生?顺便说一句,收到的BLOB似乎在Chrome开发者工具的资源范围内

不管怎样,这个问题把我引向了第二个问题:这个进程的内存消耗不断上升,在大约400-500MB的时间后,它会被刷新,并在90MB时再次启动,再次上升。这么久了,这只是一个记忆问题。但有时可能会发生这样的情况,即内存没有刷新,并上升到大约600MB。在这一点上,我没有收到任何新的图像。控制台显示一个错误,显示:

加载资源失败:服务器响应状态为404(未找到)

此错误发生在此行中:

camImg.src = window.URL.createObjectURL(data);
目前,我通过捕获错误事件来解决此问题:

camImg.onerror = function()
{
    //request next frame anyway and wait for memory flush
    ws.send("give me the next image!");
};
所以我只是请求新的图像,因为在一段时间后内存会再次刷新(几秒钟后),我可以接收新的图像

使用Opera也会出现同样的问题。我想这主要是内存消耗的问题。也许是浏览器中的错误?还是我犯了一个很大的编程错误

我非常感谢您的帮助,因为我不知道是什么导致了这个问题…

OS:Windows7 64位

Chrome版本35.0.1916.153 m

Chrome版本38.0.2068.0金丝雀(64位):(chrome://flags/#impl-侧面喷漆设置没有区别)

在我正在做的一个原型中,我得到了与Chrome35和最近的金丝雀版本完全相同的行为。可以在IE和firefox中使用。我正在运行一个本地主机C++的WebSoCKserver,大约有10MPS,图像为0.5MB。 chrome的内存最终会上升,一些东西也会把chrome弄脏

向前迈进:

1) 在image.onerror中,我调用window.URL.revokeObjectURL(this.src);这似乎解决了我的内存泄漏问题,但不是404

2) 在F12调试器下运行时,速度非常慢,我似乎没有遇到问题。因此在页面上我有3个计数器:1)BLOB接收计数,2)image.onload计数和3)image.onerror计数。 大约900次成功加载后,我开始出现加载失败。然后,在50次失败之后,我又开始获得成功的加载。这种模式不断重复,但数字似乎是随机的(这似乎有点GC相关的问题,但只是基于经验的预感)

3) 我可以通过更改ws.binaryType='arraybuffer'来修复(也称为'bodge')。我需要一个blob,所以我基于一个新的Uint8Array(msg.data)构建了一个新的blob。一切正常,完全没有负载故障

我在这里制作了一个不必要的二进制副本,但它似乎没有任何明显的速度差异。我不能100%确定这里发生了什么以及修复的稳定性

internet上大多数类似的图像加载示例都没有onerror处理程序。在我的机器上运行这样的示例会导致无法解释的内存泄漏。除非在调试器和lucky下,否则不会看到404。互联网上有很多人抱怨加载图像时内存泄漏。也许有关系

我将在chromium论坛上提出这个问题

希望这有助于。。。马特

这是铬的问题