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 服务器内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Node.js中的内存泄漏分析

Node.js内存泄漏分析

在 Node.js 中使用流时内存泄漏?

Node.js内存泄漏分析

java 线程泄之一

如何定位 Node.js 的内存泄漏