IE6 кадры и утечка памяти - PullRequest
22 голосов
/ 09 марта 2012

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

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

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

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

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

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

  1. Я проверял это на IE9, и проблемы все еще там, но немного более контролируемые

  2. Редизайн приложения может занять около 500 тыс. Долл. США и 6-12 месяцев.

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

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

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

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

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

<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 и нажимаю автообновление, об утечках памяти не сообщается.Однако, если я щелкну правой кнопкой мыши -> Обновить на отдельном кадре, 75% загруженных элементов в DOM будут перечислены как утечки.

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

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

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

Ответы [ 3 ]

2 голосов
/ 26 апреля 2012

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

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

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

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

2 голосов
/ 13 марта 2012

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

Чтение включает, но не ограничивается:

0 голосов
/ 09 апреля 2012

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

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

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

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

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