Понимание шаблона в Графике производительности памяти Chrome DevTools - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь понять, как предотвратить утечки памяти при использовании таймеров.Я полагаю, что график памяти на вкладке «Быстродействие инструментов разработчика Chrome» (я все еще изучаю эту функцию) показывает плохую схему управления памятью.Я считаю, что это случай «пилообразного» паттерна при каждом срабатывании таймера.

У меня есть простой тестовый случай (1. щелкните правой кнопкой мыши «timer-adder.html»,2. нажмите «Предварительный просмотр», чтобы получить предварительный просмотр загруженного HTML-кода), что включает использование функции конструктора для создания объектов, которые работают как таймеры, другими словами, для каждого обновления DOM изменяется внутри обратного вызова setInterval.

//...
start: function (initialTime, prefixedId) {
        let $display = document.getElementById(prefixedId + '-display');
        if ($display.style.display === 'none') { $display.style.display = 'block'; }
        $display.textContent = TimerHandler.cycle(initialTime);
        $display = null;
        return setInterval(function () {
            this.initialTime--;
            (this.initialTime === 0 && this.pause());
            document.getElementById(prefixedId + '-display').textContent = TimerHandler.cycle(this.initialTime);
        }.bind(this), 1000);
},
/...

Попытки минимизировать утечку, хотя это не имеет прямого отношения к тому, что я считаю проблемой:

  • назначение $display для null, чтобы сделать его коллекционным (сборщик мусора).
  • очистка интервала;

То, что я считаю плохим шаблоном: image Просмотр сообщения на imgur.com (с возможностью масштабирования)

Добросовестное использование памяти означало бы, что DevTools показывает горизонтальную линию?Каков был бы более безопасный подход к этому побочному эффекту?Потому что, поскольку тестирование проводится прямо сейчас, я думаю, что в долгосрочной перспективе несколько активных таймеров перегрузят память и, следовательно, приведут к заметному снижению производительности.

PS: Как новичок, я надеюсь, что эточестное изложение проблемы.Спасибо.

1 Ответ

0 голосов
/ 21 сентября 2019

Как вы можете видеть из последней части, Garbagge Collector смог освободить эту память .Таким образом, нет утечки памяти.

Коллекция Garbagge - сложная задача, поэтому V8 старается свести к минимуму количество коллекций «Останови мир».Или другими словами: он очищает память , только если это необходимо .В вашем случае это не так.До сих пор достаточно свободного места.

Если при вызовах GC сохраняется (заметное количество) памяти, значит, у вас есть утечка памяти.

присвоение $display нулю длясделать его коллекционным (сборщик мусора).

Это просто ненужно.$display не доступен во внутренней функции, поэтому он жизнеспособен для gc'ing после выполнения init.Переназначение этого не меняет этого.

...