我遇到了使用内存中词典的应用程序的问题(通过新的构造函数(bla,fla,pla)实例化)。 一旦常驻存储器大小接近~100-150 Mbs,标记 - 紧凑相位需要超过一秒。每一百兆增加一秒。
通过运行以下内容可以重现该行为:
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试图移动无论如何都不会被释放的对象。
我找到的唯一解决方案是将这些对象移动到Buffer中,但对于我的应用程序而言,这意味着JSON.stringify | JSON.parse的开销很可能最终会占用更多的CPU时间。另外,这需要相当重写。
据我所知,这可能更像是一个v8问题,但是可能有某种方法可以绕过那些不会发布的对象的GC吗?
node.js版本是0.6.11
答案 0 :(得分:1)
您是否尝试过使用REDIS或Membase来比较性能?到目前为止,我可以看到,您达到了可以将其视为内存数据库的级别,因此您可以尝试与实际使用这些数据库进行比较。