如何更改Heroku nodejs worker以避免内存泄漏?

时间:2014-09-07 09:26:24

标签: javascript node.js heroku memory-leaks

这是Heroku上的节点js worker:

var Worker = require('./worker.js')
...
Worker.performJob(data) //data is a small object with just 3 attributes

worker.js:

var Worker = {}
Worker.performJob = function (data) {
  //read lots of data into memory, call other functions with this data as parameters
  var hugeData = readFromDb()
  Worker.processStuff(hugeData)
}

Worker.processStuff = function (hugeData) {
  ...
}

module.exports = Worker

工作人员一遍又一遍地监听某些事件并开始处理数据。 随着时间的推移,工作者使用的内存会增长 - 当performJob()完成时,它不会被释放,即使所有巨大的变量都是本地的。 本文http://www.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/暗示它可能是因为Worker全局变量,它保留了对函数的引用。

如何编写工人以避免这种情况?

UPDATE 我通过在同一个.js文件中移动函数来改变了worker。现在它读取

performJob(data)

function performJob(data) {
  //read lots of data into memory, call other functions with this data as parameters
  var hugeData = readFromDb()
  processStuff(hugeData)
}

function processStuff(hugeData) {
  ...
}

但是,每次执行任务后内存都会增长,并在空闲时保持该级别(如https://devcenter.heroku.com/articles/log-runtime-metrics所示),然后在另一项任务后再次增长......

0 个答案:

没有答案