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
我没有,但它不会在我的情况下可行。 的一点是,如果我一成不变的缓存数据,我可以写我的应用程序是这样的(即同步): 'user.item = storage.get(“项目”,的itemId)' 使用任何一种外部存储将使我使用异步方法。 此外,我发现我的应用程序泄漏,所以问题有所缓解。 – Prologus 2012-08-30 13:20:38