[英]Memory Leak in Node.js Program
我正在設計一個守護進程(特別是Heroku的一個工作進程)和我在ram使用中慢慢累積的代碼。 它是一個小量(100kb / 10秒),但我知道,對於長期使用這個過程,最好保持ram使用一致。 我是新手創建的程序,設計為運行很長時間,並且仍然是在Node和Javascript中開發應用程序的新手。 這是我的大部分代碼:
////////////////
// Queue Loop //
////////////////
var worker = (function() {
var buffer = "";
var couchdb = http.get({
auth: db_user + ":" + db_pass,
host: db_host,
path: '/queue/_all_docs?include_docs=true',
port: db_port
}, function( response ) {
response.setEncoding('utf8');
response.on("data", function( data ) {
buffer += data;
});
response.on("end", function() {
var queue = JSON.parse(buffer);
if ( !queue.error ) {
buffer = "";
couchdb = http.get({
auth: db_user + ":" + db_pass,
host: db_host,
path: '/flights/_all_docs?include_docs=true',
port: db_port
}, function( response ) {
response.setEncoding('utf8');
response.on("data", function(data) {
buffer += data;
});
response.on("end", function() {
var flights = JSON.parse(buffer);
if ( !flights.error ) {
for ( row in queue.rows ) {
console.log(queue.rows[row].doc.flight);
}
for ( row in flights.rows ) {
console.log(flights.rows[row].doc.program);
}
setTimeout( worker, 10000 );
} else {
// db error
}
});
}).on("error", function() {
setTimeout( worker, 10000 );
});
} else {
// db error
}
});
}).on("error", function() {
console.error("CouchDB is currently not available.");
setTimeout( worker, 10000 );
});
});
///////////////
// Run Queue //
///////////////
(function() {
worker();
})();
那么,使用相同數量的ram來保持這樣的程序不斷運行的最佳方法是什么? 還有哪些其他設計注意事項對於保持其良好運行以充當Heroku上的工作進程至關重要?
哦,至於它做什么,它從CouchDB實例中提取一些條目,然后它根據這些條目運行預測。
事實證明,Node.js提供了一個很好的函數叫做process.nextTick()
來清除調用堆棧(編輯:這可能不是這種情況,但它可以幫助積累事物)。 通過將我的所有調用包裝到其中的worker,我可以防止理論堆棧溢出(這沒有發生,但我的內存使用量不斷增長)。
我對這個功能的理解不是很深刻,但它確實做了我一直想做的事情。
(編輯:結果節點通過V8進行FANTASTIC垃圾收集,雖然它以奇怪的間隔運行!)
閱讀次數:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.