2014-10-31 14 views
5

Ich versuche zu verstehen, wie funktioniert der GC auf node.js. Es scheint, als würde die V8-Engine den Speicher nicht freigeben.Warum node.js Speicher nicht freigibt?

Ich machte ein sehr einfaches Skript, das einen HTTP-Server implementiert, und ich speichere die Speicherauslastung alle 3 Sekunden in einen Stream.

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

Ich bin die letzte Version von node.js 0.10.33

ich mit Gatling bin mit Anfrage per http-Server senden (15 Anfragen/s während der 30er Jahre dann 30 Anfragen/s während 30s dann 100 Anfragen/sec während 30s)

die folgenden Tabellen stellen die heapUsed, heapTotal und rss gegeben durch process.memoryUsage() memory usage after 3 tests

Aft Bei diesen Tests gibt es keine Aktivität auf dem Server, aber der Speicher wird nicht freigegeben, selbst nach mehr als 1 Stunde.

memory usage after 80min

Kann jemand mir erklären, wenn es das Standardverhalten des v8 Erinnerung ist, wenn es ein Speicherleck in meinem Skript ist?

Danke für die Hilfe

+0

Haben Sie eine Lösung dafür gefunden? Ich habe gerade ein ähnliches Problem. – ilse2005

Antwort

0

Meine Vermutung ist, dass Sie nicht die Speichernutzung für die große Sammlung auszuführen überschritten hat. Das ist nicht genug "alter Raum" wurde in "neuen Raum" umgewandelt (http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).

Sie müssen den GC zum Ausführen zwingen. Die meisten anderen Laufzeiten erlauben einen programmatischen Aufruf, um den GC zum Laufen zu bringen, aber ich bin mir nicht sicher über V8.

+0

Sie können '--expose-gc' zur Befehlszeile hinzufügen und eine globale Funktion' gc() 'wird verfügbar gemacht, um den GC synchron auszulösen. – mscdex

+0

Erzwingen Sie nicht, dass der GC ausgeführt wird. Es macht einen guten Job, wenn es nötig ist. – Joe

Verwandte Themen