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正在不断增加。

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

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

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

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

只是回答 post 中的一个问题:

How do I make sure that script takes absolutely zero resources once it is finished? (I even tried process.exit at the end of the script)

发生了误会:

http://www.linuxatemyram.com/

Don't Panic! Your ram is fine!

What's going on? Linux is borrowing unused memory for disk caching. This makes it looks like you are low on memory, but you are not! Everything is fine!