2014-10-31 14 views
5

Tôi đang cố gắng hiểu cách hoạt động của GC trên node.js. Có vẻ như động cơ v8 không giải phóng bộ nhớ.Tại sao node.js không giải phóng bộ nhớ?

Tôi đã tạo một tập lệnh rất đơn giản, triển khai máy chủ http và tôi lưu mức sử dụng bộ nhớ vào luồng 3 giây một lần.

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

Tôi đang sử dụng phiên bản cuối cùng của Node.js 0.10.33

Tôi đang sử dụng Gatling để gửi yêu cầu đến máy chủ http của tôi (15 yêu cầu/giây trong độ tuổi 30 sau đó 30 yêu cầu/giây trong 30 rồi 100 yêu cầu/giây trong độ tuổi 30)

các biểu đồ sau đây đại diện cho heapUsed, heapTotalrss do process.memoryUsage() memory usage after 3 tests

Aft er những thử nghiệm, không có hoạt động trên máy chủ nhưng bộ nhớ không được phát hành, thậm chí sau hơn 1 giờ.

memory usage after 80min

Ai đó có thể giải thích cho tôi nếu đó là hành vi chuẩn của bộ nhớ v8 của nếu có một rò rỉ bộ nhớ trong kịch bản của tôi không?

Cảm ơn sự giúp đỡ

+0

bạn đã tìm thấy giải pháp cho điều này chưa? Tôi đang gặp phải sự cố tương tự ngay bây giờ. – ilse2005

Trả lời

0

Tôi đoán là bạn không vượt quá mức sử dụng bộ nhớ để thực hiện thu thập chính. Đó là không đủ "không gian cũ" đã được chuyển đổi thành "không gian mới" (http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).

Bạn cần buộc GC chạy. Hầu hết các runtimes khác cho phép một cuộc gọi có lập trình để buộc GC chạy nhưng tôi không chắc chắn về V8.

+0

Bạn có thể thêm '--expose-gc' vào dòng lệnh và một hàm toàn cục' gc() 'sẽ được tạo sẵn để kích hoạt đồng bộ GC. – mscdex

+0

Không buộc GC chạy. Nó tự làm tốt khi cần. – Joe

Các vấn đề liên quan