Dart Websocket 内存泄漏

Posted

技术标签:

【中文标题】Dart Websocket 内存泄漏【英文标题】:Dart Websocket memory leak 【发布时间】:2016-06-06 20:14:05 【问题描述】:

我正在使用 websockets 接收协议缓冲区并遇到内存泄漏。无论传入缓冲区大小和频率如何,都会发生这种泄漏。

protobufs 作为 Blobs 被接收,但在作为 arrayBuffer 接收时存在相同的泄漏。目前我所实现的只是一个数据包处理程序,它将 Blob 设置为 null 以尝试调用垃圾收集。

我的听电话: ws.onMessage.listen(handlePacket);

我的事件处理程序:void handlePacket(message) message = null;

我不完全了解 websocket 中的 messageEvents 流是否是一个未将已处理事件出队的队列,但似乎为传入事件分配的所有内存都未能被垃圾回收。感谢所有帮助。

编辑 客户端代码:

  void _openSocket() 
    if (ws == null) 
      ws = new WebSocket('ws://localhost:8080/api/ws/open');
      // ws.binaryType = "arraybuffer";
    
  

  void _closeSocket() 
    if (ws != null) 
      ws.close();
      print("socket closed");
      ws = null;
    
  

void _openStream (String fieldName, [_]) 
  //Check if we need to open the socket
  _openSocket();
  //Request the proper data
  Map ask = "Request": "Stream", "Field": fieldName;
  if (ws.readyState == 0)
    ws.onOpen.listen((_) 
      ws.send(JSON.encode(ask));
    );
   else 
    ws.send(JSON.encode(ask));
  

  activeQuantities++;
  if (activeQuantities == 1) 
    _listen();
  


// Receive data from the socket
 _listen() 
  ws.onError.listen((_)
    print("Error");
  );
  ws.onClose.listen((_)
    print("Close");
  );
  ws.onMessage.listen(handlePacket);    


void handlePacket(message) 
  message = null;

【问题讨论】:

其余代码在哪里?您应该包括复制问题所需的所有内容。 发布了进一步的代码,当单击按钮时,调用 _openStream 来启动套接字连接和/或向请求的数据添加另一个字段。 【参考方案1】:

看起来 Dartium 会泄漏内存,但是当使用 Dart2js 并在 Chrome 中运行时,它确实成功地进行了 GC,尽管在显示与 Dartium 中相同的症状之后。 https://github.com/dart-lang/sdk/issues/26660

【讨论】:

以上是关于Dart Websocket 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Websocket 内存泄漏 node.js。事件发射器?

nodejs Websocket服务器 - 检测到可能的EventEmitter内存泄漏

flv直播流播放视频,websocket响应造成内存泄漏 浏览器崩溃

nodejs setMaxListeners 避免内存泄漏检测

Safari 中的数据 URI 泄漏(原为:HTML5 画布的内存泄漏)

Flutter - 关闭小部件时 BLoC 流实例会导致内存泄漏吗?