求解一个 Nodejs 内存泄露问题

求解一个 Nodejs 内存泄露问题

tail () { const ts = this.lastTs const nss = this.defs.map(def => def.ns) const filters = { ns: { $in: nss }, ts: { $gt: Timestamp.fromNumber(ts) } } const curOpts = { tailable: true, awaitdata: true, numberOfRetries: 60 * 60 * 24, // Number.MAX_VALUE, tailableRetryInterval: 1000 }

util.log(`Begin to watch... (from ${ts})`)
return new Promise((resolve, reject) =>
  mongodb.connect(this.url2).then(db => {
    this.db = db
    const stream = db.collection('oplog.rs').find(filters, curOpts).stream()
    stream
      .on('data', log => {
        if (log.op === 'n' || log.ts.toNumber() === ts) return
        this.process(log)
      })
      .on('close', () => {
        util.log('Stream closed....')
        this.db = null
        db.close()
        resolve()
      })
      .on('error', err => {
        this.db = null
        db.close()
        reject(err)
      })
  }))

}

目的是读取 monogodb 的 oplog 将数据同步到 mysql 里边


3 回复

return 函数对象形成的闭包导致,对象用完指定为 null,应该是这个理


感谢指点

在Node.js中,内存泄露通常是由于未正确管理内存导致的,比如未释放的事件监听器、全局变量、闭包中的未释放资源等。下面是一些常见的检查和处理内存泄露的方法,以及一个示例代码来展示如何检测内存泄露。

1. 使用内存分析工具

Node.js 提供了多种内存分析工具,如 heapdump 和 Chrome DevTools。你可以使用这些工具生成和分析堆快照。

2. 监听内存使用情况

你可以使用 process.memoryUsage() 方法来监控应用的内存使用情况。

setInterval(() => {
    const memoryUsage = process.memoryUsage();
    console.log(`RSS: ${memoryUsage.rss} bytes, Heap Total: ${memoryUsage.heapTotal} bytes, Heap Used: ${memoryUsage.heapUsed} bytes`);
}, 1000);

3. 检查事件监听器

未释放的事件监听器是常见的内存泄露源。你可以使用 EventEmitter.listenerCount(emitter, eventName) 来检查事件监听器的数量。

4. 示例代码

下面是一个简单的示例,展示如何检测未释放的事件监听器导致的内存泄露:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

function createLeak() {
    myEmitter.on('event', () => {});
}

setInterval(createLeak, 100); // 模拟内存泄露

setInterval(() => {
    console.log(`Listener count: ${myEmitter.listenerCount('event')}`);
}, 1000);

在上述代码中,createLeak 函数每秒添加一个事件监听器,这将导致内存泄露。通过监听器计数,你可以检测到内存泄露。

解决内存泄露的关键在于理解你的应用如何管理内存,并定期进行代码审查和内存分析。

回到顶部