jQuery - утечки памяти в Internet Explorer - PullRequest
2 голосов
/ 14 июля 2011

Я разрабатываю внутреннее веб-приложение для службы поддержки, в котором я работаю, предназначенное для работы в полноэкранном режиме на больших телевизорах по всей комнате с отображением соответствующих данных для парней, принимающих вызовы. Мы используем Internet Explorer 8 в Windows 7 (политика безопасности компании запрещает использовать любой другой браузер) и jQuery 1.6.2 . Все сценарии и данные хранятся в локальной сети - из Интернета ничего не выходит.

По сути, приложение запрашивает несколько файлов XML (генерируемых серверными сценариями) для отображения текущей информации, такой как:

  • статистика для каждой очереди вызовов, например, количество ожидающих вызовов (перезагружается каждые 5 секунд)
  • текущие объявления (отображаются в формате слайд-шоу с использованием цикл jQuery , перезагружается при достижении конца текущего списка объявлений)

В моем тестировании в Firefox, Chrome и т. Д. Все работает прекрасно. Но в Internet Explorer, если страница остается открытой более 10 минут или около того, весь браузер начинает зависать и зависать.

Я провел немало исследований по утечкам памяти в javascript / jQuery, и хотя нашел несколько интересных статей, большинство из них связано с утечками, возникающими при создании или удалении элементов в jQuery - то, что я не делаю.

Я по сути работаю так:

  1. Загрузка XML из скрипта
  2. Итерация по каждому из набора элементов (например, очередей вызовов), затем присвоение соответствующих дочерних элементов переменным.
  3. Используйте эти переменные, чтобы собрать простую строку HTML (используя массив, я прочитал, что построение строк таким образом более эффективно для памяти, чем построение строки с использованием конкатенации, например, string = string + 'blarg';)
  4. HTML выводится прямо в ожидающий контейнер <div>, заменяя все, что было в нем раньше.

Все выглядит примерно так

$.get('dashboard-queues.asp', function(data) {
    var allQueues = new Array();
    $(data).find('queue').each(function() {
        var thisQueue = new Array(); // array used to build HTML string for this queue

        var callsWaiting = parseFloat($(this).find('waiting').text());
        var activeCalls = parseFloat($(this).find('active').text());

        // (etc...)

        thisQueue.push("<div class='q-item'>"+callsWaiting+"</div>");
        thisQueue.push("<div class='q-item'>"+activeCalls+"</div>");

        // (etc...)

        allQueues.push(thisQueue.join(''));
    });

    $("#callboard").html(allQueues.join(''));
});

Там есть небольшая дополнительная обработка, которая изменяет HTML-код, выводимый для этого фрагмента данных при определенных обстоятельствах (например, если слишком много вызовов ожидает). Кроме того, я немного обработал после вывода HTML-кода - выяснил, сколько вызовов в общей сложности ожидает, процент отказов в вызове за день и т. Д. - но это все простые вычисления.

Я был очень осторожен, чтобы сбрасывать переменные и массивы каждый раз, когда мы выполняем цикл, чтобы убедиться, что они не сохраняют данные. Похоже, не очень помог.

Я могу опубликовать более актуальный код, если это необходимо (я не хотел делать этот пост слишком гигантским для начала). Кто-нибудь может увидеть, где я могу столкнуться с какими-либо проблемами? Если кто-то может предложить более эффективные или лучшие способы выполнения того, что я пытаюсь сделать, это было бы очень кстати.

Приветствия:)

1 Ответ

0 голосов
/ 14 июля 2011

Если у вас есть доступ к IE9, вы можете попробовать нажать F12, а затем выбрать вкладку профилировщика. Я понимаю, что ваше требование для IE8, а не 9, но это может, по крайней мере, помочь вам описать, где проблема может быть связана с большими анонимными кусками низкой производительности.

Глядя на ваш код, я не уверен, что, возможно, основной $. Get будет действовать как замыкание. Я вполне уверен, что JQuery правильно обрабатывает замыкания и сборщик мусора, но, возможно, IE8 не работает так, как ожидалось в этом случае ..?

извиняюсь за косвенный не ответ ... Удачи!

Этот комментарий , похоже, может иметь какое-то отношение, поскольку вы имеете дело с манипулированием DOM и обработкой событий.

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