You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

y-websocket 1.5.0内存泄漏(Map未释放)问题修复咨询

y-websocket 1.5.0 内存泄漏问题排查与修复

我使用y-websocket 1.5.0作为服务端执行协作任务,运行一段时间后服务总会重启。通过内存dump发现,一个元素数为0的Map占用了5万+内存,疑似使用后未被正确释放。

疑问

  1. Node.js中Map何时会引发内存泄漏?
  2. 如何在使用后正确关闭Map?

我曾尝试修改y-websocket的utils.js文件,添加如下代码:

if (doc.conns.size === 0 && persistence !== null) {
      // if persisted, we store state and destroy ydocument
      persistence.writeState(doc.name, doc).then(() => {
        doc.destroy()
      })
      docs.delete(doc.name)
      doc.conns = null
    }

但这破坏了y-websocket的工作流程,以下是结合相关问题给出的正确修复方案。


一、Node.js中Map引发内存泄漏的场景

  • 存在未清除的引用:如果Map被全局变量、闭包等活跃对象持续引用,哪怕Map内元素已清空,垃圾回收器也无法回收它占用的内存。
  • 闭包持有引用:Map被闭包捕获,且闭包所在的函数上下文未销毁,Map会一直驻留内存。
  • 全局作用域的Map:声明在全局作用域的Map,除非主动解除引用,否则会一直存在,不会被回收。
  • 关联事件监听器未移除:如果Map绑定了事件监听器但未移除,即使元素清空,监听器的引用也会导致Map无法被回收。

二、正确关闭/释放Map的方法

  • 解除所有引用:将Map变量设为null,或从包含它的对象/数组中删除对应键/元素,确保无活跃引用指向它。
  • 清空后解除引用:先调用map.clear()清空元素,再将Map变量置为null,减少垃圾回收前的内存占用。
  • 避免全局引用:尽量将Map限制在局部作用域,函数执行完毕后,局部作用域的Map若无闭包捕获,会自动失去引用。
  • 移除关联事件监听器:若Map绑定了事件,先移除监听器,再释放Map引用。

三、y-websocket 1.5.0 内存泄漏的正确修复方案

之前的修改思路方向正确,但同步删除文档并置空引用会破坏异步持久化流程。结合相关Issue的解决方案,正确做法是在持久化完成后再执行文档销毁和引用清除:

修改utils.js中连接断开的处理逻辑:

if (doc.conns.size === 0 && persistence !== null) {
  // 等待持久化完成后再销毁文档、清除引用
  persistence.writeState(doc.name, doc).then(() => {
    doc.destroy();
    docs.delete(doc.name);
    doc.conns = null;
  }).catch(err => {
    // 处理持久化失败情况,避免文档一直占用内存
    console.error('Failed to write state for document', doc.name, err);
    doc.destroy();
    docs.delete(doc.name);
    doc.conns = null;
  });
} else if (doc.conns.size === 0) {
  // 无持久化配置时直接销毁文档
  doc.destroy();
  docs.delete(doc.name);
  doc.conns = null;
}

关键注意点:

  • 异步流程顺序:必须在persistence.writeState的Promise完成(成功或失败)后,再执行销毁和清除操作,避免持久化过程中文档被提前移除导致错误。
  • 错误处理:添加catch块处理持久化失败场景,确保即使写入失败,文档资源也能被释放。
  • 覆盖无持久化场景:未配置持久化时,直接销毁文档并清除引用,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Dolphin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:42:22