【发布时间】:2015-04-07 02:45:15
【问题描述】:
我正在使用 node.js 和 io.socket 来编写一个应该保存所有消息并向他们显示两个新用户的聊天。 消息存储到对象数组中。 当我用 2MB(复制并粘贴到 .txt)进行测试时,我的任务管理器显示 node.js 需要大约 200MB!从一开始就没有消息,它需要 ~19MB。 所以我问我的代码中是否有任何内存泄漏,或者 socket.io 是否通过在第二个数组中每次使用 .emit 来保存数组?
这是我的代码:
save_object=new Array();
save_object['chat']=new Array();//for the chat room,now there's just this one
io.sockets.on('connection', function (socket) {
// client is connected
socket.emit('chat', { time: new Date(), text: 'you are now connected
to the server!' });
//send all msgs on start
socket.emit('all',save_object['chat']);
// user-send event
socket.on('chat', function (data) {
// send msg
io.sockets.emit('chat', { time: new Date(),
name: data.name || 'anonymous', text: data.text });
//save new msg to the array
save_object['chat'][save_object['chat'].length]=
new Object({ time:new Date(), name: data.name || 'anonymous',
text: data.text });
});
});
【问题讨论】:
-
Err..save_object 是一个数组,这意味着“save_object['chat']”意味着您正在使用字符串索引您的数组,这并不是一个好主意。您可能会考虑将 save_object 设为对象?此外,最好使用 [] 和 {} 而不是 new Array() 和 new Object()。
-
19M 用于一个成熟的 Javascript 解释器,使用了大量的库听起来并不多......我不太习惯 node.js,但不是有某种您可以将调试器附加到您的程序吗?
-
@MarcusMüller 我认为你错过了重要的一点,在插入 2MB 的文本后,该过程使用了 200MB 的内存。
-
如果再插入 6MB 的文本,它会进一步增加吗?它应该,但不会再增加 600MB。
-
好吧,@RobRaisch 已经指出了你的字符串索引的问题——另外,插入 2MB 的文本可能会发生在假设 1000 个块中,而这 20B 块中的每一个都有一个 64 位的日期附上一个简单的 10B 用户名,然后是底层解释器对象和堆栈帧——真的,开始调试。单看是做不到的。
标签: arrays node.js memory socket.io