Sph*_*inx 1 javascript node.js javascript-objects
如何从多维关联数组(OK,OK - 对象)中正确删除项目?仅仅召唤delete他们就足够了吗?也许我应该在一段时间内明确调用 global.gc() ?
这是我的 Node.js 服务器代码的一部分。我注意到内存消耗日复一日地增长,它在高负载峰值时上升,然后下降,但永远不会回来。请帮我!
我正在使用 Node.js 4.1.2 和 Socket.IO 1.3.7
var sockets = []; // global sockets storage
var channels = []; // global users storage (grouped by channels)
/* ... */
function SOCKET_ON_channel_subscribe(socket, data) {
var user_sockets = [];
user_sockets.push(socket.id);
var user = {
sockets: user_sockets,
info: user_info
};
// add user
if (channels[channel] == undefined) channels[channel] = [];
channels[channel][user_id] = user;
sockets[socket.id] = {channel: channel, user_id: user_id};
}
function SOCKET_ON_disconnect(socket) {
if (sockets[socket.id] != undefined) {
var channel = sockets[socket.id].channel;
var user_id = sockets[socket.id].user_id;
// detach socket and delete it
var index = channels[channel][user_id].sockets.indexOf(socket.id);
channels[channel][user_id].sockets.splice(index, 1);
delete sockets[socket.id];
// no more attached sockets? delete user
if (channels[channel][user_id].sockets.length == 0) {
delete channels[channel][user_id];
if (arrSize(channels[channel]) == 0) delete channels[channel];
}
}
}
/* ... */
function arrSize(arr) {
var size = 0, key;
for (key in arr) {
if (arr.hasOwnProperty(key)) size++;
}
return size;
}
Run Code Online (Sandbox Code Playgroud)
仅仅召唤
delete他们就足够了吗?
delete不从内存中删除对象本身。它只是从对象中删除属性。如果该属性是唯一引用它所引用的对象的东西,那么它们是的,这就足够了,因为没有其他东西会引用该对象,最终 V8 将回收内存(一旦有一些内存压力)。如果有任何其他内容涉及它,则删除该属性只会删除该属性。
也许我应该
global.gc()在一段时间内明确打电话?
这通常不是必需的。
...它在高负载峰值时上升,然后下降,但永远不会回来。
如果“永远不会回来”是指它永远不会完全回落,那么您可能在某处确实存在内存泄漏。很难用这样不完整的代码来暗示它可能在哪里(channel例如,是什么?),但看起来您正在使用数组来实现它们的数组性(indexOf, splice)和它们的对象特征(非索引属性名称) . 我可能会将这两种用途分开,将它们混为一谈,至少会令人困惑。
| 归档时间: |
|
| 查看次数: |
794 次 |
| 最近记录: |