我正在努力摆脱内存泄漏,但我对这方面的事情的了解相当低,我没有人请求帮助。我的脚本正在杀死服务器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会不断增加。
process.exit
)答案 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)
存在误解:
不要恐慌!你的公羊很好!发生了什么? Linux正在借用未使用的内存来进行磁盘缓存。 这使得你看起来内存不足,但你不是! 一切都很好!