2014-10-31 7 views
5

Sto cercando di capire come funziona il GC su node.js. Sembra che il motore V8 non rilasci la memoria.Perché node.js non rilascia memoria?

Ho realizzato uno script molto semplice implementando un server http e ho salvato l'utilizzo della memoria in un flusso ogni 3 secondi.

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); 

Sto utilizzando l'ultima versione di node.js 0.10.33

che sto usando Gatling di inviare richiesta al mio server http (15 richieste/sec durante 30s poi 30 richieste/sec durante 30s poi 100 richieste/sec durante 30s)

le seguenti tabelle illustrano il heapUsed, heapTotal e rss in process.memoryUsage() memory usage after 3 tests

poppa er tali test, non c'è attività sul server ma la memoria non viene rilasciata, anche dopo più di 1 ora.

memory usage after 80min

Qualcuno mi può spiegare se è il comportamento standard della memoria v8 di se v'è una perdita di memoria nel mio script?

Grazie per l'aiuto

+0

hai trovato una soluzione per questo? Ho di fronte un problema simile in questo momento. – ilse2005

risposta

0

mia ipotesi è che non ha superato l'utilizzo della memoria per la maggiore raccolta da eseguire. Questo non è abbastanza "vecchio spazio" è stato convertito in "nuovo spazio" (http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).

È necessario forzare l'esecuzione del GC. La maggior parte degli altri runtime consente una chiamata programmatica per forzare l'esecuzione del GC, ma non sono sicuro del V8.

+0

È possibile aggiungere '--expose-gc' alla riga di comando e una funzione globale' gc() 'sarà resa disponibile per attivare il GC in modo sincrono. – mscdex

+0

Non forzare l'esecuzione del GC. Fa un buon lavoro da solo quando è necessario. – Joe