Методы устранения неполадок "A script на этой странице заставляет IE работать медленно", вызванный AJAX?

У меня есть страница в моем приложении, которая обновляет некоторый контент (список зарегистрированных пользователей) с сервера каждые 10 секунд. Эти данные загружаются с использованием класса Ajax из mootools framework, в частности, с Javascript, который выглядит следующим образом:

var xmldata = (function() {
 new Ajax('xmldata.jsp?time='+$time(), {method: 'get', onComplete: dataLoaded, autoCancel: true}).request();
}).periodical(10000);

(который каждые 10 секунд создает объект Ajax и вызывает его request() метод, который будет вызывать метод dataLoaded() по завершении).

Если пользователь покинет окно своего браузера, откроется на этой странице около 45-60 минут, тогда попытка навигации в другом месте вызовет IE (v7 точно, v6, как я полагаю, Firefox или Chrome не имеют этой проблемы), чтобы отобразите следующее всплывающее окно:

Прекратите выполнение этого script? A script на этой странице заставляет Internet Explorer работать медленно. Если он продолжает работать, ваш компьютер может перестать отвечать на запросы.

Теперь мне кажется, что это, скорее всего, вызвано утечкой в ​​базовом script в структуре mootools - слишком много вызовов Ajax.request() находятся в очереди, чтобы их вызывали, или некоторые объекты не были должным образом очищается, хотя предполагается, что в структуре есть некоторые функции сбора мусора.

Каковы наилучшие способы анализа того, что движок IE Javascript сделал под обложками? Есть ли какой-либо возможный способ определить, правильны ли какие-либо из моих гипотез?

Я видел, что в аналогичном вопросе, кто-то предложил, используя IBM Page Profiler для отладки этого вопрос. Я пробовал использовать Профилировщик страниц и не имел большого успеха - кажется, это полезно, если у вас возникла проблема с начальной загрузкой страницы (чтобы проанализировать, какой компонент вызывает чрезмерную задержку загрузки), но это не кажется чтобы анализировать, что происходит с Javascript, запущенным на странице после полной загрузки. Я вижу в Профилире страницы, что асинхронные вызовы xmldata.jsp запрашиваются каждые 10 секунд, но Profiler страницы показывает, что сервер отвечает нормально (примерно за 600 мс), но не знает, как эта страница родительского script использует эти данные.

Кроме того, в этом сообщении в списке обсуждений с отключенным mootools, кто-то предлагает удалить код, который регистрирует прослушиватель unload вызовите метод сбора мусора, чтобы решить эту проблему, но это похоже на разрешение симптома проблемы, а не самой проблемы.

2 ответа

Это, вероятно, утечка памяти/ресурса в IE. Наиболее распространенным источником этого является закрытие кода кода или кода. Я всегда проверяю отслеживание проблем для своей инфраструктуры javascript для сообщений об ошибках. Много раз я был спасен сообщениями об ошибках и исправлениями от других пользователей.

Чтобы попробовать проблему, вы можете попробовать что-то вроде т.е. детектор течи. Существует отличная статья msdn, которая также объясняет утечку памяти IE.

Богатый источник утечек - обработчики событий, вам действительно нужно прочитать статью MSDN, чтобы понять это. Они часто создают утечки только вашего типа, поэтому поиск незарегистрированных обработчиков событий, вероятно, является хорошей идеей.

Я должен признать, что непрерывная перезагрузка каждые 10 секунд в течение часа звучит неплохо; Я не уверен, что вы должны ожидать, что IE станет намного лучше (возможно, немного на низкой стороне, но все же). Возможно, вам придется корректировать свои ожидания или, по крайней мере, установить целевую цель выполнения в одной версии IE.

Ожидания: для "общей" версии IE существует слишком много разных версий со слишком большим количеством различных ошибок, которые вы можете настроить на 100% стабильности для долгосрочных приложений во всех этих версиях. Поэтому, по крайней мере, изначально я считаю целесообразным выбрать конкретную версию в качестве цели.


Во-первых, вы можете проверить наличие утечки, разрешив ему работать в течение часа и посмотреть, значительно ли увеличивается использование памяти IE. Другая проблема может заключаться в том, что IE имеет какой-то внутренний счетчик, который вычисляет общее время, используемое javascript на странице, а затем отображает предупреждение, если вы используете больше, чем x секунд. Даже если каждый запрос не использует много CPU, в течение часа он может использовать много, поэтому IE может обнаружить это как проблему. Кроме того, я не знаком с mootools, но вы можете убедиться, что используете асинхронные вызовы AJAX, чтобы свести к минимуму количество времени ожидания в вашем javascript-коде.

licensed under cc by-sa 3.0 with attribution.