У меня проблема с приложением, использующим словари в памяти (создается с помощью нового конструктора (bla, fla, pla)).Как только размер резидентной памяти приближается к ~ 100-150 Мбит / с, фаза сжатия метки занимает больше секунды.Каждая сотня мег добавляет одну секунду.
Поведение можно воспроизвести, выполнив следующее:
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, которая, скорее всего, приведет к увеличению времени процессора.Кроме того, это потребует переписывания.
Я понимаю, что это может быть больше проблемой v8, но может быть есть какой-то способ обойти GC для объектов, которые не будут выпущены?
node.js версия 0.6.11