原生JS Promise的这种使用会导致Node.js中的内存泄漏吗?

时间:2017-02-20 15:39:48

标签: javascript node.js memory-leaks promise v8

以下是我所拥有的代码的示例表示。我有一个UDP接收器,它可以连续接收非常大量的数据包。这是股市实时数据。这应该会对数据包的容量有所了解。

根据收到的数据,更新发送到Mysql DB,另一个发送到MongoDB。然而,这个代码会像任何东西一样泄漏内存,并且在具有7.5GB RAM的EC2机器上在大约12分钟内发生OOM错误。这次崩溃非常一致。

我阅读了几个有关Promise链接或递归调用Promises的内存泄漏的stackoverflow问题和github问题。我觉得我的代码不符合该描述,因此想知道这段代码是否也会导致内存泄漏。

当我将整个代码更改为无需Promise且仅回调时,内存消耗仅接近1%。完全没有泄漏。

我正在使用当前稳定版本的Node.js(v6.9.5 LTS)。使用本机Promise,没有像Bluebird等的库。

const dgram = require('dgram');
const receiver = dgram.createSocket('udp4');
const myObject = require('./myObject.js');

receiver.on('message', function(payload, sender) {
  myObject.processPayload(payload); 
});

receiver.bind(PORT);

// In mObject.js
var myObject = {
  processPayload: function(payload) {
    var updateDoc = doSomethingToPayload(payload);
    // Mongo npm package offers APIs which return a Promise
    var promise1 = this.mongoClient.collection('coll1').update(updateDoc);
    var promise2 = this.getMysqlPromise(updateDoc);
    Promise.all([promise1, promise2]).then(function(values) {
      doSomethingElse();
    }).catch(function(err) {
      doErrorHandling();
    });
  },

  // The mysql npm package does not offer APIs which return a Promise. Hence creating a Promise myself.
  // The mysql2 package does. Tried that too and the same memory leak exists.
  getMysqlPromise: function(updateDoc) {
    var queryStatement = buildQueryFromUpdateDoc(updateDoc);
    var self = this;
    var promise = new Promise(function(resolve, reject) {
      self.MysqlDB.query(queryStatement, function(err, results, fields) {
        if (err) {
          reject(err);
          return;
        }

        resolve(results);
      });
    });
    return promise;
  }
}

0 个答案:

没有答案