为什么node.js不释放内存?

7
我正在尝试理解node.js上的垃圾回收机制。看起来v8引擎不会释放内存。
我编写了一个非常简单的脚本实现了一个HTTP服务器,并在每3秒保存一次内存使用情况到一个流中。
var http = require('http'),
fs = require('fs'),
heapdump = require('heapdump'),
memwatch = require('memwatch');


http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(8888);

console.log('Server running on port 8888.');

memwatch.on('leak', function(info) {
    // look at info to find out about what might be leaking
    console.log('============= MEMWATCH ON LEAK ============\n',info)
});

memwatch.on('stats', function(stats) {
    // do something with post-gc memory usage stats
    console.log('============= MEMWATCH STATS ============\n', stats)
});

var myStream = fs.createWriteStream('/tmp/logmem.log');

setInterval( function() {
    var t = new Date().getTime();

    var memUsage = process.memoryUsage();
    var str = t+';heapUsed;'+memUsage.heapUsed+';0;0;0\n'+
                t+';heapTotal;'+memUsage.heapTotal+';0;0;0\n'+
                t+';rss;'+memUsage.rss+';0;0;0\n';
    myStream.write( str );

}, 3000 );

我正在使用最新版本的 Node.js 0.10.33。

我正在使用 Gatling 向我的 HTTP 服务器发送请求(每秒 15 次请求,持续 30 秒,然后每秒 30 次请求,持续 30 秒,接着每秒 100 次请求,持续 30 秒)。

下面的图表表示由 process.memoryUsage() 给出的 heapUsedheapTotalrss3 次测试后的内存使用情况

在这些测试之后,服务器上没有任何活动,但内存没有被释放,即使超过了 1 小时。

80 分钟后的内存使用情况

请问有人能够解释一下这是否是 v8 内存的标准行为,还是我的脚本存在内存泄漏?谢谢帮助。


你找到解决方案了吗?我现在也面临着类似的问题。 - ilse2005
1个回答

0

我猜测你没有超过内存使用量,以便进行主要收集的执行。也就是说,不足够的“旧空间”被转换为“新空间”(http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection)。

你需要强制运行GC。大多数其他运行时允许编程调用来强制运行GC,但我不确定V8是否支持。


1
你可以在命令行中添加 --expose-gc,这样就会提供一个全局函数 gc() 来同步触发垃圾回收。 - mscdex
1
不要强制运行垃圾回收。当它需要时,它会自己完成很好的工作。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接