2012-03-30 73 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