2014-10-31 12 views
5

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.

memory usage after 80min

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

+0

czy znalazłeś rozwiązanie problemu? Mam teraz do czynienia z podobnym problemem. – ilse2005

Odpowiedz

0

Domyślam się, że nie przekracza zużycie pamięci dla głównego zbioru wykonać. To za mało "starej przestrzeni" przekształcono w "nową przestrzeń" (http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).

Musisz zmusić GC do działania. Większość innych środowisk uruchomieniowych zezwala na programowe wywołanie wymuszające działanie GC, ale nie jestem pewien co do V8.

+0

Możesz dodać "--expose-gc" do linii poleceń, a funkcja globalna "gc()" zostanie udostępniona do synchronicznego wyzwalania GC. – mscdex

+0

Nie zmuszaj GC do działania. Wykonuje dobrą pracę sam, gdy jest to konieczne. – Joe

Powiązane problemy