Node.js GC mark-compact

我有一个使用内存字典的应用程序的问题(通过新的构造函数(bla,fla,pla)实例化)。 只要常驻内存大小接近〜100-150 Mbs,mark-compact阶段就需要一秒多的时间。 每百个megs增加一秒钟。

行为可以通过运行以下内容来重现:

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

然后做curl localhost: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试图绕过那些无法被释放的对象。

我find的唯一的解决scheme是将这些对象移动到一个缓冲区,但对于我的应用程序,这意味着JSON.stringify | JSON.parse的开销,最有可能将在更多的CPU时间结束。 另外,这将需要相当重写。

我明白,这可能是更多的一个V8的问题,但也许有一些方法来规避GC不会被释放的对象?

node.js版本是0.6.11

您是否尝试过使用REDIS或Membase比较性能? 据我所知,你达到了可以被认为是内存数据库的级别,所以你可以尝试比较一下这些。