Способы устранения неполадок «Сценарий на этой странице вызывает медленную работу IE», вызванный AJAX? - PullRequest
4 голосов
/ 23 декабря 2008

У меня есть страница в моем приложении, которая обновляет некоторый контент (список пользователей, которые в данный момент вошли в систему) с сервера каждые 10 секунд. Эти данные загружаются с использованием Ajax класса из фреймворка mootools , в частности, с 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 не имеют этой проблемы), чтобы отобразить следующее всплывающее окно:

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 23 декабря 2008

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

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

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

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

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

0 голосов
/ 23 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...