Node.js搜索内存泄漏

时间:2016-10-10 09:11:15

标签: node.js memory-leaks ram

我正在努力摆脱内存泄漏,但我对这方面的事情的了解相当低,我没有人请求帮助。我的脚本正在杀死服务器RAM,我无法弄清楚我的方法有什么问题。

我有这个功能:

function getPages(params){
  gmail.users.messages.list(params, (err, resp)=>{

    for (var message of resp.messages) {
      message['ownerEmail'] = currentUser;
      getMessage(message); // this does something with it later
      var message = null;
    }

    if(resp.nextPageToken){
      params.pageToken = resp.nextPageToken;
      getPages(params);
    } else {
      // resolve end here...
    }

  })//gmail.users.messages.list
}//fetchPages
getPages(params);

基本上它从API获取消息,然后应该对它做一些事情。只要有更多数据要提取,它就会自行执行。 (只要nextPageToken存在于响应中)。

现在我运行了这个命令:

$ free -lm

              total        used        free      shared  buff/cache   available
Mem:          11935        1808        7643         401        2483        9368
Low:          11935        4291        7643
High:             0           0           0
Swap:          6062           0        6062

当脚本运行时,buff / cache会不断增加。

  • 实际上什么是buff / cache,它与我的Node脚本有什么关系?
  • 如何管理缓冲/缓存的内容以及如何删除/清除此类内容?
  • 如何优化上述功能以忘记已处理的所有内容?
  • 如何确保脚本在完成后获取绝对零资源? (我甚至在剧本的最后尝试了process.exit
  • 如何从我的Node.js脚本调试和监控RAM使用情况?

3 个答案:

答案 0 :(得分:0)

我认为没有内存泄漏。我认为你处于递归的无限循环中。 gmail.users.messages会返回resp.nextPageToken存在的响应(我猜),然后您再次调用getPages(params);。您可以在console.log函数调用之前放置getPages(params);吗?这样的事情:

if (resp.nextPageToken) {
  params.pageToken = resp.nextPageToken;
  console.log('token', params.pageToken)
  getPages(params);
}

并检查您打印多少次以及是否退出递归。另外,为什么要将消息设置为null进入迭代?有一个重新定义的变量。

答案 1 :(得分:0)

您可以使用N | Solid(免费用于开发),您将在其包装内启动您的应用。它非常易于使用,它可以让您在发生泄漏的地方进行完整的剖析。 您也可以使用内置调试器手动执行此操作,检查每一步的内存消耗。

答案 2 :(得分:0)

回答帖子中的一个问题:

  

如何确保脚本一旦获得绝对零资源   完了吗? (我甚至在脚本末尾尝试了process.exit)

存在误解:

http://www.linuxatemyram.com/

  不要恐慌!你的公羊很好!

     

发生了什么? Linux正在借用未使用的内存来进行磁盘缓存。   这使得你看起来内存不足,但你不是!   一切都很好!