1

gzip サポートを追加したときに、nodejs でメモリ リークの問題が発生しました。テスト用のコードをいくつか書きました。以下のコードでは zlib を使用していますが、メモリ リークが発生する理由がわかりません。メモリリークを避けるためにこのコードを改善するにはどうすればよいですか? 誰でも私を助けることができますか?

var 
zlib = require('zlib'),
crypto = require('crypto');

var cacheList = {
  article: {},
};

  var timeoutId1, timeoutId2

  console.log('process.pid: '+ process.pid);

  clean = function()
  {
    var time = new Date().getTime();
timeoutId1 = setTimeout(function() { clean() }, 5000);

var countDeleted = 0;

for (id in cacheList.article) {
  if (cacheList.article[id] && cacheList.article[id].timeExpire + 5000 < time) {
    delete cacheList.article[id];
countDeleted++;
  }
}

console.log('deleted: ' + countDeleted);

}

  run = function()
  {
var time = new Date().getTime();
timeoutId1 = setTimeout(function() { run() }, 5);

var md5 = crypto.createHash('md5');
md5.update('' + time);
var id = md5.digest('hex');

//console.log('id: ' + id);
var text = id+id+id+id+id+id+id+id +id+id+id+id+id+id+id+id +id+id+id+id+id+id+id+id +id+id+id+id+id+id+id+id +id+id+id+id+id+id+id+id +id+id+id+id+id+id+id+id +id+id+id+id+id+id+id+id +id+id+id+id+id+id+id+id;

zlib.gzip(text, function(err, result) {
  if (!err) {
      cacheList.article[id] = {
      timeExpire: time + 10000,
      data: text,
      datagzip: result,
    };
  }
});

}

  timeoutId1 = setTimeout(function() { run() }, 3000);
  timeoutId2 = setTimeout(function() { clean() }, 5000);
4

1 に答える 1

0

最後の2行を次のように変更します

timeoutId1 = run()
timeoutId2 = clean()

setTimeout を呼び出す関数が既にあるため、別の setTimeout を使用することで、その関数の別のインスタンスを実行するように指示することになります (その関数は自分自身を呼び出すため、2 回実行するなど)。

于 2012-06-14T12:21:39.317 に答える