Подтвердить что ты не робот

Камеры IE6 и утечка памяти

Прежде чем начать этот вопрос, я понимаю, что все его аспекты ошибочны. Помните об этом...

У меня есть приложение для интрасети CRM-ish со встроенным программным обеспечением, разработанным в 2001 году, которое я унаследовал. Это приложение для коллекций, которое объединяет средства управления телефонией с веб-интерфейсом для управления учетными записями. (Телефония Genesys и система коллекций на базе AS400... с использованием MQSeries)

Я пытаюсь модернизировать это приложение настолько, насколько возможно, до того, как я назову его "конец жизни". В рамках моих попыток его модернизации я реализовал интерфейс jQuery и jQuery для моей JS-функции и пользовательского интерфейса. Я не схожу с ума от этого, но он довольно укоренился.

Теперь введите проблему: в настоящее время мы используем IE6, и приложение построено с использованием фреймов. Реализация библиотек jQuery выявила ситообразную природу приложения с точки зрения памяти. В настоящее время он потребляет около 75 МБ памяти при запуске и растет примерно до 150 Мб - 300 Мб примерно через 2-3 часа. Затем сбой браузера.

Я сузил утечку памяти до перекрестного разговора между кадрами. Я тестировал страницы отдельно в sIEve и Drip, и никаких утечек не обнаружено. Но обращайтесь к страницам в наборе фреймов, и это бомба замедленного действия.

Я знаю, что ответ заключается в том, чтобы перепроектировать приложение без фреймов и начать использовать лучший браузер. Есть две проблемы:

  • Я тестировал это на IE9, и проблемы все еще есть, но немного более контролируемый

  • Редизайн приложения займет около 500 тыс. и 6-12 месяцев.

Кто-нибудь знает, как решить проблему "утечки кадров"? Я знаю, что я не приводил примеров кода, но я просто ищу общие знания. Я вызываю метод IE CollectGarbage() в onload и onunload для каждой страницы приложения, но безрезультатно. Я попытался вызвать метод empty() в jQuery. Я попытался установить для каждого дочернего элемента document.body значение null. Ничего не работает.

Мне бы очень хотелось отменить все эти изменения, потому что на самом деле есть некоторые довольно большие функции сокращения затрат, которые были реализованы.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

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

Я установил базовый набор фреймов с 5 экземплярами одной и той же страницы (тот, который, я уверен, не имеет утечек в sIEve).

<html>
    <head>
        <title>Frame Leak Test</title>
    </head>
    <frameset cols="*" rows="50%,50%" frameborder="1">
        <frameset cols="33%,33%,34%" rows="100%">
            <frame src="http://npasappgeneqa02/live/" />
            <frame src="http://npasappgeneqa02/live/" />
            <frame src="http://npasappgeneqa02/live/" />
        </frameset>
        <frameset cols="50%,50%" rows="100%">
            <frame src="http://npasappgeneqa02/live/" />
            <frame src="http://npasappgeneqa02/live/" />
        </frameset>
    </frameset>
</html>

Загружаемая страница индекса не обнаруживает утечек в sIEve.

Когда я загружаю страницу набора фреймов в sIEve и нажимаю auto-refresh, утечек памяти не сообщается. Однако, если я щелкнул правой кнопкой мыши → обновление на отдельном фрейме, 75% загруженных элементов в DOM попадают в список утечек.

Очевидно, что автообновление эквивалентно обновлению F5/shift + F5. И это очищает память для страницы. Но когда отдельный кадр перезагружается, память никогда не очищается... по-видимому. И каждый экран, который мои пользователи должны видеть, перезагружается в основной кадр.

Я не могу просто обновить набор фреймов, потому что в наборе фреймов есть программный телефон, который приведет к Armageddon, если он обновлен или вышел из строя неправильно.

Кто-нибудь знает, как управлять памятью фреймов, не обновляя его?

4b9b3361

Ответ 1

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

  • Вместо использования полной библиотеки jQueryUI на страницах, где нужны элементы интерфейса, я использовал индивидуальные свернутые скрипты (uicore + datepicker и т.д.).
  • По возможности я избегал элементов пользовательского интерфейса, которые использовали виджет script, поскольку именно здесь возникла самая большая концентрация проблем.
    • а. Это заставило меня написать собственные скрипты для элементов button и элемента accordion.
  • Поскольку это приложение работает в frameset, использование методов window (т.е. window.onload, window.onunload) не работает, поскольку само окно только загружает или выгружает с помощью frameset. Чтобы бороться с этим, я применил методы document.body, в частности, document.body.onbeforeunload, и сделал глобальный unbind, чтобы удалить любые ссылки, которые выходили ($("*").unbind();).

При использовании вышеописанной методологии мое 4-часовое потребление памяти в IE6 (и IE8) снизилось с ~ 200-250Mb до ~ 80-95Mb. Моя цель состояла в том, чтобы сохранить 8-часовое потребление до 150 МБ, и я думаю, что это выполнит задачу.

Спасибо всем за вашу помощь.

Ответ 3

Я бы предложил запустить ваш JS-код через JSLint или JSHint.

Эти две утилиты (*) - это проверки качества кода для Javascript. На что они жалуются, где JS-код действителен, но содержит плохие методы программирования.

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

(* JSHint - это вилка JSLint, но теперь они достаточно разные, что стоит попробовать их обоих)