【问题标题】:After transfering data using Socket.io emit, how could I release the data in memory?使用 Socket.io emit 传输数据后,如何释放内存中的数据?
【发布时间】:2013-04-14 22:46:57
【问题描述】:

根据 Chrome 的开发工具,由于某种原因,使用 socket.emit() 后,数据仍在内存中。由于我必须多次使用这行代码,内存使用量不断增加。 我在客户端的 JS 代码:

socket.emit('upload',{data: a_very_long_string});

【问题讨论】:

  • 这是严重阻碍你的工作还是仅仅为了知识?您能否将您的发现放在问题中,例如它消耗了多少内存。
  • 实际上,它阻碍了我的工作,因为我正在尝试构建一个使用 websocket 作为传输数据方式的游戏。就像我每次使用emit上传2M图像时,它都会吃掉2M(不完全是,但它显示在chrome的开发工具曲线中)。但我希望我的游戏能够运行几个小时而不会导致浏览器崩溃。

标签: javascript html node.js memory-leaks socket.io


【解决方案1】:

JS 中的局部变量(用var 声明)在函数返回时自动进行垃圾回收。如果它是一个全局变量,你可以随时通过delete 释放它。所以我猜你的情况是因为在emit()之后没有释放一些全局变量。

我发现这篇文章谈论的是 Socket.IO 中的内存泄漏,这对您的情况可能会有所帮助。 http://jpallen.net/2013/03/08/tracking-down-a-memory-leak-in-node-js-and-socket-io/

关于释放变量,可以参考这个问题:Memory release from local variable in JavaScript

【讨论】:

  • 不。我很确定这不是我的 js 代码中的问题。以下感冒不会增加我的内存使用量: var a="very......long"; socket.emit('上传',{});但如果我使用: var a="very...long"; socket.emit('upload',{a:a});,我的内存使用率真的很高。另外,我问的是浏览器的内存使用情况,而不是 node.js。
  • socket.io 与文章中提到的项目与 chrome 中的项目相同。无论如何,它们在 V8 上运行,无论您在 node 或 chrome 中运行它。内存泄漏不是来自您的代码,而是在套接字模块中。
  • 但需要知道是socket.io的问题还是V8的问题。如果是V8,我可以切换到FF甚至IE,因为我的问题是浏览器崩溃。如果它来自 socket.io,我可以尝试其他 websocket 库。
  • 似乎我的问题没有好的解决方案。但必须给你功劳
【解决方案2】:

这是 socket.io 的问题。这是因为 websocket 服务器中的内存泄漏。

请参阅此处发布的解决方案:

  1. http://jpallen.net/2013/03/08/tracking-down-a-memory-leak-in-node-js-and-socket-io/
  2. https://github.com/LearnBoost/socket.io/issues/1015

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多