Возможные утечки памяти с использованием веб-работников (сборщик мусора)

У меня есть приложение, которое вызывает веб-работник после нажатия кнопки. Расчеты перемещаются на работника для облегчения пользовательского интерфейса и делают его отзывчивым к действию пользователей во время проведения вычислений.

Все идет хорошо, а после примерно 0,8-1,5 тыс. Работник посылает ответ. На работнике. Расположите все необходимые домовые действия. Но после того, как этот GC появляется и практически блокирует интернет-интерфейс на 2 или более секунд в зависимости от CPU. Это действительно запутает меня, потому что блокировка пользовательского интерфейса - это то, что я хочу предотвратить.

Вот скриншот вкладки консоли временной шкалы / памяти: http://i.imgur.com/zuoha.jpg

Как вы можете видеть события GC сразу после всех манипуляций DOM. На самом деле есть только одно перераспределенное событие (используется DocumentFragment).

Основной код JS:

var sortWorker = new Worker('js/contactsorter.js');
sortWorker.onmessage = function(e) {
    var messages = [];
    e.data.forEach(function(userDoc) {
        var contactSection = _drawContact(userDoc);
        messages.push(contactSection);
    });

    meta.append(messages); // this actually appends document fragment as a child
};

sortWorker.postMessage(postMessageData);

Contactorter.js (работник):

onmessage = function(e) {
    var uid, output = [], usersStat = {};

    // calculations...

    postMessage(output);
    close();
};

Есть ли способ избежать этих событий GC в этом месте или нет?

UPD: мне кажется, что событие GC Время зависит от суммы данных, которые были отправлены на работника. UPD2: После выключения и загрузки событий GC происходят только дважды блокируют UI менее чем за секунду. HM?

8
задан Dmitrii Sorin 15 September 2011 в 04:40
поделиться