【发布时间】:2015-06-02 23:10:36
【问题描述】:
我有一个大小超过 100 KB 的 gameserver.js 文件。每次刷新浏览器后,我都会检查我的任务管理器,并且每次刷新都会看到我的 node.exe 内存使用率不断上升。我在这里使用ws 模块:https://github.com/websockets/ws 并认为,你知道吗,my 代码中的某处很可能存在一些内存泄漏......
为了仔细检查和隔离问题,我创建了一个test.js 文件并放入默认的ws 代码块:
var WebSocketServer = require('ws').Server
, wss = new WebSocketServer({ port: 9300 });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
});
然后启动它:
现在,我检查node.exe的内存使用情况:
让我困惑的增量部分是:
如果我刷新与此端口9300 websocket 服务器建立连接的浏览器,然后回头查看我的任务管理器.. 它显示:
现在在:14,500 K。
而且它在每次刷新时都会不断上升,所以理论上如果我继续刷新它就会突破屋顶。这是故意的吗? ws 模块中是否存在内存泄漏?我问的全部原因是因为我认为可能在几分钟内或者当用户关闭浏览器时它会重新关闭,但事实并非如此。
以及我想要进行此测试的核心原因是因为我认为我的个人代码中的某个地方存在内存泄漏问题,并且只是想检查它是否不是我,反之亦然。现在我被难住了。
【问题讨论】:
-
您是否尝试过在服务器端实际关闭这些连接,而不是让它们超时空闲?当它们打开时,它们需要内存来跟踪。如果您的浏览器代码和服务器代码都没有明确关闭它们,则它们必须超时,这可能需要一段时间。即便如此,GC 是被动的而不是激进的,它不会以直观的“立即使用更少的内存更好”的方式运行和释放内存。它不是那样工作的。
-
哇哦。 Check here 他们传递的参数只是消息和代码,所以我认为我不能专门关闭连接,只需要像你说的那样等待超时。不过我明白你的意思,谢谢。我会尝试找到一种方法来立即关闭它们而不是等待超时。这就是内存使用量增加的原因。
-
@Peter Lyons 我收回这一点,有办法。它是:
socket.close();full code,我在“onclose”处理程序上使用它。问题是,即使在这样做之后,内存使用量也不会下降.. 嗯 -
需要注意的是,v8 中的 GC 有点懒惰,如果不需要,通常不会立即进行垃圾收集。更好的方法是使用自动化来长时间测试套接字的打开和关闭。