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