[英]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不断增加。
process.exit
) 我不认为有内存泄漏。 我认为你处于递归的无限循环中。 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)
一直存在误解:
不要惊慌! 你的公羊很好!
这是怎么回事? Linux正在借用未使用的内存来进行磁盘缓存。 这使得你看起来内存不足,但你不是! 一切顺利!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.