Прежде чем начать этот вопрос, я понимаю, что все его аспекты ошибочны. Помните об этом...
У меня есть приложение для интрасети 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, если он обновлен или вышел из строя неправильно.
Кто-нибудь знает, как управлять памятью фреймов, не обновляя его?