【问题标题】:Node.js search for memory leakNode.js 搜索内存泄漏
【发布时间】:2016-10-10 09:11:15
【问题描述】:

我正在尝试摆脱内存泄漏,但我对这方面的了解非常低,我没有人可以寻求帮助,期待你们。我的脚本正在杀死服务器 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 使用情况?

【问题讨论】:

    标签: node.js memory-leaks ram


    【解决方案1】:

    我认为没有内存泄漏。我认为您处于递归的无限循环中。 gmail.users.messages 返回带有 resp.nextPageToken 的响应(我想),然后您再次调用 getPages(params);。你能在getPages(params); 函数调用之前放一个console.log 吗?类似的东西:

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

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

    【讨论】:

    • 那部分很好。当它到达页面末尾时,它不会提供 nextPageToken 并且来自else 块的代码将被执行,它可能有任何退出方法,并且函数自我执行在if true 块内
    • @Kunok 您可以在调用 getPages 并开始递归之前尝试使用 nextTick 吗?看看这里:stackoverflow.com/questions/8112398/…
    【解决方案2】:

    您可以使用 N|Solid(它可免费用于开发),您将在其包装器中启动您的应用程序。它非常易于使用,它允许您在发生泄漏的地方制作完整的轮廓。 您也可以使用内置调试器手动执行此操作,检查每个步骤的内存消耗。

    【讨论】:

      【解决方案3】:

      只是为了回答帖子中的一个问题:

      如何确保脚本一旦完成就绝对占用零资源 完成了吗? (我什至在脚本末尾尝试了 process.exit)

      有误会:

      http://www.linuxatemyram.com/

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

      发生了什么事? Linux 正在借用未使用的内存来进行磁盘缓存。 这使您看起来内存不足,但事实并非如此! 一切都很好!

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 2012-03-11
        • 2016-01-01
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多