javascript - 在 JavaScript 中删除项目并释放内存

标签 javascript node.js javascript-objects

如何正确删除多维关联数组中的项目(好的,好的 - 对象)?只需为它们调用 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;
}

最佳答案

Is it enough just to call delete for them?

delete 本身不会从内存中删除对象。它只是从对象中删除属性。 如果该属性是唯一引用它所引用的对象的东西,那么是的,这就足够了,因为没有其他东西会引用该对象,并且最终 V8 将回收内存(一旦存在一些内存压力)。如果有其他引用它,那么删除该属性只会删除该属性。

Maybe I should explicitly call global.gc() with some time period?

这通常是不必要的。

...it rises on high load peaks, then lowers, but never comes back.

如果“永远不会回来”你的意思是它永远不会一路回落,那么你可能确实在某个地方发生了内存泄漏。很难用这样不完整的代码来暗示哪里可能会出现这种情况(例如,channel 是什么?),但看起来您使用数组既是因为它们的数组性质(indexOfsplice),也因为它们的对象特性(非索引属性名称)。我可能会将这两种用途分开,将它们混为一谈,至少会令人困惑。

关于javascript - 在 JavaScript 中删除项目并释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33318494/

相关文章:

javascript - 如何列出 npm 用户安装的包

node.js - 应该如何为 Node.js docker 应用程序生成 package-lock.json 文件?

javascript - 检查一个值是否是 JavaScript 中的对象

javascript - 从 ajax 获取参数到 Controller Laravel

javascript - 如何替换未定义的值

javascript - 如何使用 jQuery Mobile 确保动态 DOM 元素具有正确的 css

javascript - scrapy-splash 用于渲染 javascript

node.js - AWS Lambda 安全 - 默认访问 Cognito?

javascript - 循环对象数组中的属性的最有效方法是什么?

javascript - Object.create(null) 的用例