在JavaScript中删除项目和释放内存

时间:2015-10-24 12:59:47

标签: javascript node.js javascript-objects

如何从多维关联数组中正确删除项目(OK,OK - 对象)?仅仅为他们打电话delete是否足够?也许我应该在一段时间内明确地调用global.gc()?

这是我的Node.js服务器代码的一部分。我注意到内存消耗grows day after day,它在高负载峰值时上升,然后降低,但永远不会回来。拜托,帮助我!

我使用的是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;
}

1 个答案:

答案 0 :(得分:4)

  

仅为他们拨打delete是否足够?

delete不会从内存中移除对象本身。它只是从对象中删除属性。 如果该属性是唯一引用它引用的对象的东西,它们是的,这就足够了,因为没有别的东西会引用该对象,最终V8会回收内存(一旦有内存压力) )。如果其他任何 引用它,则删除该属性只会删除该属性。

  

也许我应该在一段时间内明确地致电global.gc()

这通常不是必需的。

  

......它在高负荷峰值上升,然后降低,但永远不会回来。

如果“永远不会回来”你的意思是它永远不会一直回落,那么你可能会在某处发生内存泄漏。很难说这些不完整的代码可能会出现在哪里(例如channel是什么?),但它看起来就像你正在使用数组一样为它们的数组({{ 1}},indexOf)及其对象特征(非索引属性名称)。我可能将这两种用法分开,将它们混为一谈,至少令人困惑。