【问题标题】:Node.js Map Object Causes Memory LeakNode.js 映射对象导致内存泄漏
【发布时间】:2021-02-26 09:45:41
【问题描述】:

我用 nodejs 编写了一个在线聊天网站,我正在使用地图对象来跟踪在线用户。

    const onlineUsers = new Map();
    const userRoomList = new Map();
    const userIpList = new Map();
function addClientToMap(username, status = 'vis'){
    if(!onlineUsers.has(username)){
        onlineUsers.set(username, status)
    }
}

function addUserIpList(username, ip){
    if(!userIpList.has(username)){
        userIpList.set(username, ip)
    }
}

function removeClientFromMap(username, socketId){
    if(onlineUsers.has(username)){
        onlineUsers.delete(username);
        userRoomList.delete(username);
    }
}

我正在存储用户的用户名,但它们会导致内存泄漏。所以我需要一个更好的选择。还有哪些方法可以存储在线用户数据?

【问题讨论】:

  • 内存泄漏是什么意思?您正在获得最大堆大小吗?您是否正在使用工具或方法来检测正在发生的内存泄漏?
  • @lukaswilkeer 我的 cpu 使用率上升到 100%,然后我无法连接到站点,直到我重新启动它,日志中没有错误。
  • 您需要进行更有针对性的调试才能知道此特定代码导致内存泄漏。 CPU 使用率上升到 100% 可能是很多事情。诊断可能的内存泄漏的常用方法是使用堆快照。

标签: node.js memory memory-leaks


【解决方案1】:

如果你想避免内存泄漏,你需要将你的用户存储在 socket.room 如果你使用套接字,如果你使用长池,将用户存储在你的数据库中。

【讨论】:

  • Okey 但是如果我使用数据库来存储我的在线客户,那会不会很耗时?因为每次当我想添加某人或删除某人或获取在线用户列表时,我都必须在 db 上运行查询?
  • 为此使用 socket.io。这个图书馆正在代替你做所有事情。如果你使用这个库,你将不必使用数据库;)
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2011-03-22
  • 2016-01-17
  • 1970-01-01
  • 2015-07-06
  • 2014-06-07
  • 2013-11-20
相关资源
最近更新 更多