我正在尝试了解如何在node.js上运行GC。似乎比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服务器发送请求(30秒内15请求/秒,30秒30请求/秒,30秒30请求/秒)
以下图表代表heapUsed
给出的heapTotal
,rss
和process.memoryUsage()
memory usage after 3 tests
在这些测试之后,服务器上没有任何活动,但即使超过1小时也没有释放内存。
如果我的脚本中存在内存泄漏,是否有人会解释我是否是v8内存的标准行为?
感谢您的帮助
答案 0 :(得分:0)
我的猜测是你没有超过要执行的主要集合的内存使用量。这还不够“旧空间”被转换为“新空间”(http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection)。
您需要强制GC运行。大多数其他运行时允许程序调用强制GC运行,但我不确定V8。