Javascript Node.js GC标记压缩
我遇到了一个使用内存字典(通过新构造函数(bla、fla、pla)实例化)的应用程序的问题。 一旦驻留内存大小接近100-150 Mbs,标记压缩阶段就需要一秒钟以上的时间。每一百兆加一秒 通过运行以下命令可以复制该行为:Javascript Node.js GC标记压缩,javascript,node.js,garbage-collection,Javascript,Node.js,Garbage Collection,我遇到了一个使用内存字典(通过新构造函数(bla、fla、pla)实例化)的应用程序的问题。 一旦驻留内存大小接近100-150 Mbs,标记压缩阶段就需要一秒钟以上的时间。每一百兆加一秒 通过运行以下命令可以复制该行为: node --trace_gc test-memory.js test_memory.js: var http = require('http'), Construct = function () { this.theField = Mat
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试图绕过无论如何都不会被释放的对象
我找到的唯一解决方案是将这些对象移动到缓冲区中,但对于我的应用程序来说,这意味着JSON.stringify | JSON.parse的开销,这很可能会占用更多的CPU时间。此外,这将需要相当多的重写
我知道这可能更像是一个v8问题,但是否有某种方法可以绕过GC来处理那些不会被释放的对象
node.js版本为0.6.11您是否尝试过将性能与使用REDIS或Membase进行比较?据我所见,您已经达到了可以将其视为内存中数据库的级别,因此您可以尝试将其与实际使用的数据库进行比较。我没有,但在我的情况下,它将不可行。关键是,如果我缓存不可变数据,我可以这样(即同步地)编写我的应用程序:
user.item=storage.get('item',itemId)
使用任何类型的外部存储将使我使用异步方法。此外,我发现我的应用程序中存在漏洞,因此问题有所缓解。