我们正在通过websockets将二进制数据从我们的服务器传输到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浏览器的内存使用量不断增长,好像垃圾收集器永远不会释放斑点。它会一直持续增长,直到Chrome关闭websocket连接或崩溃。我们尝试使用各种方法手动释放evt.data,但没有任何帮助。您可能希望上面的代码不会导致Chrome中的内存泄漏,对吗?如何释放evt.data引用的blob?
答案 0 :(得分:1)
嘿,我找到了"内存泄漏的原因" - 它不是内存泄漏,而是我的编程错误。在这里发布以防万一其他人犯同样的错误。发生的事情是 - 对于大于64KB的消息,您需要将数据长度格式化为以网络字节顺序打包的64位整数。我没有正确地将基于Windows的__int64转换为网络字节顺序。所以浏览器认为它下载了一条巨大的消息(10GB或类似的东西) - 并一直下载直到内存不足。