繁体   English   中英

Node.js搜索内存泄漏

[英]Node.js search for memory leak

我试图摆脱内存泄漏,但我对这方面的事情的了解相当低,我没有人请求帮助。 我的脚本正在杀死服务器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使用情况?

我不认为有内存泄漏。 我认为你处于递归的无限循环中。 gmail.users.messages返回响应, resp.nextPageToken存在(我想),然后你调用getPages(params); 再次。 你可以在getPages(params);之前放一个console.log getPages(params); 功能调用? 像这样的东西:

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

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

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

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

如何确保脚本在完成后获取绝对零资源? (我甚至在脚本的末尾尝试了process.exit)

一直存在误解:

http://www.linuxatemyram.com/

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

这是怎么回事? Linux正在借用未使用的内存来进行磁盘缓存。 这使得你看起来内存不足,但你不是! 一切顺利!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM