簡體   English   中英

Node.js程序中的內存泄漏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM