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 脚本有什么关系?
- 如何管理 buffered/cached 以及如何 kill/clear 这样的东西?
- 如何优化上面的函数来忘记所有已经处理过的东西?
- 如何确保脚本完成后占用的资源绝对为零? (我什至在脚本末尾尝试了
process.exit
)
- 如何从我的 Node.js 脚本中调试和监控 RAM 使用情况?
我不认为存在内存泄漏。我认为你在递归中处于无限循环中。 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)
发生了误会:
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!
我正在尝试消除内存泄漏,但我对这方面的了解很低,我没有人可以向你们寻求帮助。我的脚本正在占用服务器 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 脚本有什么关系?
- 如何管理 buffered/cached 以及如何 kill/clear 这样的东西?
- 如何优化上面的函数来忘记所有已经处理过的东西?
- 如何确保脚本完成后占用的资源绝对为零? (我什至在脚本末尾尝试了
process.exit
) - 如何从我的 Node.js 脚本中调试和监控 RAM 使用情况?
我不认为存在内存泄漏。我认为你在递归中处于无限循环中。 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)
发生了误会:
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!