【问题标题】:Node.js: Serious Memory Leak Bug in newer versions?Node.js:较新版本中存在严重的内存泄漏错误?
【发布时间】:2013-04-14 13:57:39
【问题描述】:

有什么问题?

首先我认为我的 node.js 模块或代码有问题,因为当我访问我的页面时,每次访问后内存都会减少,并且没有释放回来。经过几个小时的调试,我找不到任何问题,所以我尝试了默认的 node.js 服务器示例,看看问题是在我的代码中还是在 node.js 本身。

如何重复问题:

所以我创建了这样的服务器:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(80);
console.log('Server running at port 80');

我访问mydomain.com并反复点击刷新,可用内存一直在下降,即使我释放刷新后,内存仍保持在同一水平,因此node.js保持它。

那么这里出了什么问题?

环境

我在ubuntu 12max os x 10.8.3node v0.9.0node v0.10.0v0.10.2v0.10.4v0.11.1 上进行了测试,在问题存在的地方以及在node v0.8.21 上工作正常的地方,这就是原因我说这可能是较新版本中的错误。

【问题讨论】:

    标签: javascript node.js debugging memory memory-leaks


    【解决方案1】:

    V8 将在 需要 时调用 GC,此时应减少内存使用量。

    为确保 GC 进程正常运行,我建议您使用 --expose-gc 参数运行 node 并使用以下内容检查内存使用情况:

    var http = require('http'),
        util = require('util');
    
    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end('Hello World\n');
    
        global.gc();
        console.log('Memory Usage:');
        console.log(util.inspect(process.memoryUsage()));
    }).listen(8080); // changed the port to 8080 because I didn't want to run the server as root
    
    console.log('Server running at port 8080');
    

    【讨论】:

    • 我已经知道htop 的内存使用情况。我也试过global.gc() 并输出相同的东西:),关于如何解决问题的任何建议?
    • 我在 OS X 10.8 下的 Node v0.10.4 上运行上面的代码(实际上移动了 global.gc() 和内存使用打印代码到 setInterval 回调) .3。在 HTTP 请求淹没服务器大约 1 小时后,rss 值完全冻结,heapUsed 值被限制在一定范围内(实际上是从一开始。)
    猜你喜欢
    • 2013-10-30
    • 1970-01-01
    • 2012-03-11
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多