Próbuję zrozumieć, jak działa GC na node.js. Wygląda na to, że silnik v8 nie zwalnia pamięci.Dlaczego plik node.js nie zwalnia pamięci?
Zrobiłem bardzo prosty skrypt implementujący serwer http i zapisuję użycie pamięci w strumieniu co 3 sekundy.
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);
Używam ostatnią wersję node.js 0.10.33
używam Gatling wysłać żądanie do serwera HTTP (15 Wnioski/sek podczas 30. Następnie 30 żądań/s podczas 30. niż 100 żądania/s w ciągu 30 sekund)
Poniższe wykresy reprezentują heapUsed
, heapTotal
i rss
podaje process.memoryUsage()
memory usage after 3 tests
Aft W tych testach nie ma żadnej aktywności na serwerze, ale pamięć nie zostaje zwolniona, nawet po ponad 1 godzinie.
Czy ktoś mógłby mi wyjaśnić, czy to średnia zachowanie pamięci V8, czy jest wyciek pamięci w moim skrypcie?
Dzięki za pomoc
czy znalazłeś rozwiązanie problemu? Mam teraz do czynienia z podobnym problemem. – ilse2005