带有WebSocket的Chrome内存泄漏

带有WebSocket的Chrome内存泄漏,websocket,Websocket,我们正在通过WebSocket将二进制数据从服务器传输到web浏览器。 浏览器可以很好地接收数据;我们可以用Javascript来操作它 代码是一个非常基本的代码: function WebSocketTest() { if ("WebSocket" in window) { var ws = new WebSocket("ws://localhost:3456/someresource"); ......

我们正在通过WebSocket将二进制数据从服务器传输到web浏览器。 浏览器可以很好地接收数据;我们可以用Javascript来操作它

代码是一个非常基本的代码:

   function WebSocketTest()
   {
        if ("WebSocket" in window)
        {
           var ws = new WebSocket("ws://localhost:3456/someresource");

           ......

           ws.onmessage = function (evt) 
           { 
              //var received_msg = evt.data;
              //var reader = new window.FileReader();
              //...........
           };

           ..............................................
           ..............................................

问题是——即使在这种最简单的形式下(onmessage函数都是空的,所以我们对evt.data不做任何处理,它是一个二进制blob),Chrome浏览器的内存使用量也在不断增长,就好像垃圾收集器永远不会释放blob一样。它会一直增长,直到Chrome关闭websocket连接或崩溃。我们尝试用各种方法手动释放evt.data,但没有任何帮助。您可能认为上述代码不会导致Chrome内存泄漏,对吗?如何释放evt.data引用的blob?

嘿,我找到了“内存泄漏”的原因-这不是内存泄漏,而是我的编程错误。在这里发布,以防其他人犯同样的错误。发生的情况是-对于大于64KB的消息,您需要将数据长度格式化为64位整数,并按网络字节顺序打包。我没有正确地将基于Windows的int64转换为网络字节顺序。因此,浏览器认为它正在下载一条巨大的消息(10GB或类似的东西),并一直下载,直到内存耗尽。

请不要发布注释或未注释的点序列,而不是实际的代码。请花点时间来设计和实现。什么?考虑不存在的点序列。问题只发生在你看到的代码上,没有其他问题。哦,我明白了。很抱歉,那么请去掉这些圆点,合上你的花括号。请阅读我发布的链接,你永远不知道。