node.js - 可能的 http 服务器内存泄漏
Posted
技术标签:
【中文标题】node.js - 可能的 http 服务器内存泄漏【英文标题】:node.js - possible http server memory leak 【发布时间】:2012-10-06 17:17:06 【问题描述】:Nodejs 版本:0.8.8
这里是服务器:
var http = require('http');
var port = 1338;
var ip = "127.0.0.1";
http.createServer(function (req, res)
res.writeHead(200, 'Content-Type': 'text/plain');
res.end('Hi there\n');
).listen(port, ip);
客户端(php 脚本)向上述服务器发送一个 post 请求。 POST 是一个字符串 (json),大小约为 4 MB。
如您所见,服务器对发布的数据不做任何事情。为了调试,我删除了所有代码并返回到什么都不做的 hello world 示例 :) 当我查看节点进程的内存使用情况(在 Activity Monitor、mac 应用程序中完成)时 - 它报告每个请求的节点服务器内存使用情况都越来越大。 所以在 20 次左右的请求之后,内存使用量翻了一番。
【问题讨论】:
我要问 1000 美元的问题:node.js 最终会占用所有内存并崩溃,还是内存使用量最终会回到低位? 【参考方案1】:这不是错误。这是正常的预期行为。
Node.js 基于 javascript,这是一种垃圾收集语言。简而言之,发生的情况是内存没有立即释放,而是需要一些时间才能释放内存(例如收集垃圾)。 V8(哪个节点使用)实际上有a very intelligent garbage collector,它“确保快速的对象分配、短的垃圾收集暂停和没有内存碎片”。
为了向您演示这种行为,我在 Windows 上使用 node.js 0.8.8 运行了上述脚本,并用大量 HTTP POST 请求轰炸了服务器。
Process Explorer 显示以下内存使用图:
如您所见,内存使用率上升,直到达到触发垃圾回收的某个限制。清理完成后,使用量被重置并再次开始爬升,直到下一次触发。
【讨论】:
在我最初的测试中,我提出了大约 20 个请求,并且内存一直在增加。现在,在阅读了您提供的非常有用的答案后,我不断提出请求,大约 30 左右之后,gc 开始了 :) @jsalonen 可以调整 GC 启动的限制吗? @Dave:好问题!我建议您将其作为一个新问题提出。我有一些想法,但我相信你会得到更彻底和更好的答案。只需在此处链接问题!以上是关于node.js - 可能的 http 服务器内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章