2017-01-24 4 views
-1

Реальная проблема, которая нуждается в решении: я работаю над большим приложением, исходный выпуск которого был около двух лет назад. Теперь мы добавляем новую страницу в приложение и замечаем какое-то странное поведение. Новый экран будет «всегда включен», это означает, что это экран по умолчанию в приложении, а выделенный ПК, на котором работает приложение, всегда будет отображать его по умолчанию. Через некоторое время (всего несколько минут на IE, как правило, намного больше на Chrome) все начинает плохо. Во-первых, анимация прокручивающих сообщений (если таковая имеется) становится изменчивой и медленной, в конечном итоге до такой степени, что они, кажется, перемещаются примерно на 1 пиксель в секунду. Черепство начинается через несколько минут в IE на машинах, которые мы используем, и через пару часов будет замедлен до обхода. К этому времени началось другое нечетное поведение: сам браузер будет медленно реагировать. На этом экране есть кнопка меню/входа, и есть задержка в 3-4 секунды, прежде чем что-нибудь произойдет, когда на нее нажмут. Другие визуальные элементы имеют аналогичную задержку перед обновлением, даже если они не имеют взаимодействия с пользователем.Ошибка утечки Javascript в методе рекурсивного опроса

Я и другие члены команды провели несколько дней, глядя на все, что находится на этой странице, и считают, что причина усугубляется тем, что, по-видимому, является утечкой памяти в службе, которую мы используем для опроса данных. Он отображается на каждой странице, в которой мы используем эту услугу, но мы считаем, что симптомы являются только проблемой на новом экране из-за большого количества визуальных сигналов (прокрутка, обновление значков/цветов и т. Д.), Многие из которых имеют интенсивную обработку/графику, которая запускается каждый цикл при обновлении данных и тот факт, что никто, вероятно, не оставит другие экраны в течение определенного промежутка времени, чтобы начать видеть симптомы на менее жестком -рабочая страница.

Я взял скриншот временной шкалы в инструментах разработчика Chrome, и это то, на что это похоже. Это похоже на каждую страницу, использующую нашу службу опроса. This is what the graph looks like for the actual page.

Я создал a demo of just the polling и получил аналогичный график: Demo from plnkr. Он выглядит немного менее серьезным в демоверсии, но шаблон явно похож и выглядит как утечка памяти. Как мы можем устранить утечку памяти и устранить другие проблемы?

Некоторые соответствующий код:

var reload = function() { 
     $http({ 
      method: 'GET', 
      url: 'api.txt', 
      timeout: 5000 
     }) 
     .success(function(response) { 
      //do stuff 
     }) 
     .error(function(data) { 
      //do other stuff 
     }) 
     .finally(function() { 
      timer = $timeout(reload, 1000); 
     }); 
    }; 
+0

проверить фактические распределения/освобождения - это должно сказать вам * что * сохраняется/утечка. –

+0

@ DanielA.White Как я могу проверить это? Я использовал вкладку «Профили» и проверял снимки/сравнивал их, но я не совсем уверен, что я ищу. Я не вижу ничего странного, но я никогда не пробовал отслеживать что-то подобное раньше. Откуда я знаю, что должно быть там, а что нет? – senschen

+0

https://developers.google.com/web/tools/chrome-devtools/memory-problems/ –

ответ

0

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

+0

У меня есть строка, подобная '$ scope.data = response;' в функции успеха в вызове '$ http' в 'перезарядка()'. Это считается закрытием, если это единственный раз, когда используется «ответ»? – senschen

+0

, который не будет считать функцию внутри функции, называется закрытием. –

+0

Разве это не означает, что это будет закрытие? Функция успеха находится внутри 'reload()', что и называется рекурсивно. – senschen

 Смежные вопросы

  • Нет связанных вопросов^_^