2012-03-30 75 views
4

我有與使用內存的字典應用程序的問題(通過新的構造函數(BLA,FLA,PLA)實例化)。 只要常駐內存大小接近〜100-150 Mbs,mark-compact階段就需要一秒多的時間。每百個megs增加一秒鐘。Node.js的GC標記緊湊

行爲可以通過運行以下被複制:

node --trace_gc test-memory.js 

test_memory.js:

var http  = require('http'), 
    Construct = function() { 
     this.theField = Math.random(); 
    }, 
    storage = []; 

http.createServer(function (req, res) { 
    var i = 100000; 

    while (--i) { 
     storage.push(new Construct()); 
    } 

    res.end('Lots of data generated.'); 
}).listen(1337, '127.0.0.1'); 

然後做捲曲本地主機:1337一段時間,看這個:

Scavenge 143.5 -> 143.5 MB, 2 ms. 
Mark-sweep 143.5 -> 143.5 MB, 943 ms. 
Mark-compact 143.5 -> 143.5 MB, 1306 ms. 
Scavenge 143.5 -> 143.5 MB, 2 ms. 
Mark-sweep 143.5 -> 143.5 MB, 937 ms. 
Mark-compact 143.5 -> 143.5 MB, 1189 ms. 
Scavenge 143.5 -> 143.5 MB, 2 ms. 
Mark-sweep 143.5 -> 143.5 MB, 935 ms. 
Mark-compact 143.5 -> 143.5 MB, 1191 ms. 
Scavenge 143.5 -> 143.5 MB, 1 ms. 
Mark-sweep 143.5 -> 143.5 MB, 1015 ms. 
Mark-compact 143.5 -> 143.5 MB, 1218 ms. 
Scavenge 143.5 -> 143.5 MB, 2 ms. 
Mark-sweep 143.5 -> 143.5 MB, 937 ms. 
Mark-compact 143.5 -> 143.5 MB, 1195 ms. 

據我所知,GC試圖移動那些不會被釋放的物體。

我發現的唯一的解決辦法是將這些對象移動到緩衝區中,但我的應用程序,這將意味着JSON.stringify的開銷| JSON.parse其中最有可能將更多的CPU時間結束。此外,這將需要相當重寫。

我的理解,這可能更多的是V8的問題,但可能有一些方法來規避對那些不會被釋放的對象GC?

的node.js版本是0.6.11

回答

1

您是否嘗試過使用Redis的或Membase的比較性能?據我所知,你達到了可以被認爲是內存數據庫的級別,所以你可以試着比較一下這些。

+0

我沒有,但它不會在我的情況下可行。 的一點是,如果我一成不變的緩存數據,我可以寫我的應用程序是這樣的(即同步): 'user.item = storage.get(「項目」,的itemId)' 使用任何一種外部存儲將使我使用異步方法。 此外,我發現我的應用程序泄漏,所以問題有所緩解。 – Prologus 2012-08-30 13:20:38