2014-10-31 16 views
5

GC'nin node.js.'de nasıl çalıştığını anlamaya çalışıyorum. V8 motoru hafızayı serbest bırakmıyor gibi görünüyor.Neden node.js belleği yayınlamıyor?

http sunucusu uygulayarak çok basit bir betik yaptım ve bellek kullanımını her 3 saniyede bir akışa kaydediyorum. Ben esnasında sonra 30 istekleri/sn 30s sırasında son benim http sunucusuna isteği göndermek için Gatling kullanıyorum node.js 0.10.33

sürümünü (15 istekleri/sn kullanıyorum

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

30s daha sonra 100 istek 30s sırasında/sn)

aşağıdaki grafikler temsil heapUsed, heapTotal ve process.memoryUsage() memory usage after 3 tests

Aft tarafından verilen rss Bu testler, sunucuda hiçbir etkinlik yok, ancak 1 saatten fazla olsa bile bellek serbest kalmıyor. Benim komut bir bellek sızıntısı olup olmadığını ait v8 bellek standart davranışı ise

memory usage after 80min

Biri bana açıklayabilir misiniz?

+0

Bunun için bir çözüm buldunuz mu? Şu an benzer bir problemle karşılaşıyorum. – ilse2005

cevap

0

Benim tahminim yürütmek başlıca koleksiyonu için bellek kullanımını aşmadı olan yardım için

teşekkürler. Bu yeterli "eski alan" "yeni alan" (http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection) dönüştürüldü.

GC'in çalışmasını zorlamanız gerekir. Diğer çoğu çalışma zamanı, GC'nin çalışmasını zorlamak için programlı bir aramaya izin verir ancak V8'den emin değilim.

+0

Komut satırına '--expose-gc 'öğesini ekleyebilir ve global bir işlevi kullanabilirsiniz: gc()' GC'yi eşzamanlı olarak tetiklemek için kullanılabilir. – mscdex

+0

GC'nin çalışmasını zorlama. İhtiyaç duyulduğunda kendi başına iyi bir iş çıkarır. – Joe