我遇到了使用内存中字典的应用程序的问题(通过新的构造函数(bla,fla,pla)实例化).
一旦常驻存储器大小接近~100-150 Mbs,标记 – 紧凑相位需要超过一秒.每一百兆增加一秒.
一旦常驻存储器大小接近~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,937 ms. Mark-compact 143.5 -> 143.5 MB,1189 ms. Scavenge 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,1195 ms.
据我所知,GC试图移动无论如何都不会被释放的对象.
我找到的唯一解决方案是将这些对象移动到Buffer中,但对于我的应用程序而言,这意味着JSON.stringify | JSON.parse的开销很可能最终会占用更多的cpu时间.另外,这将需要相当重写.
我知道它可能更像是一个v8问题,但是可能有一些方法可以绕过那些不会发布的对象的GC吗?
node.js版本是0.6.11