Огромное веб-приложение с утечкой памяти в IE 6
-
09-06-2019 - |
Вопрос
У меня есть огромное веб-приложение, у которого возникают проблемы с утечкой памяти в IE 6.
Исправить утечку памяти в пятистрочном примере кода, демонстрирующем проблему, несложно.
Но если у меня очень огромное приложение, с чего начать?
Решение
Проверить Капать.Обычно это позволяет избежать догадок об утечках памяти IE.
Если по какой-то причине Drip его не находит, внимательно просмотрите любой код JavaScript, работающий с событиями.Это почти всегда является источником значительной утечки памяти в браузере.
Уничтожение элемента DOM с прикрепленными к нему обработчиками без предварительного удаления этих обработчиков предотвратит восстановление памяти, связанной с этими обработчиками.
Другие советы
Приложение использует много JavaScript?
Если это так, то я обнаружил, что одна вещь, которая помогает избежать утечек памяти, — это убедиться, что вы используете среду JavaScript, такую как Prototype или jQuery, потому что они опробовали и протестировали код обработки событий, который не приводит к утечке памяти.
- IE6 также может привести к утечке памяти, если у вас есть циклические ссылки на объекты DOM
- Также попробуйте это Детектор утечек памяти JavaScript и посмотрите, сможете ли вы диагностировать, в чем проблема
Вот как я решил проблему утечки памяти в IE7.Идея состоит в том, чтобы обнулить все свойства расширения на всех узлах DOM при выгрузке страницы.Это сработало для меня.Вы можете найти это полезным.
<!--[if lt IE 8]>
<script type="text/javascript">
function disposeAll() {
if (window.document.all) {
for (var index = 0; index < window.document.all.length; index++) {
try { dispose(window.document.all[index], []); } catch (e) { debugger; }
}
}
dispose(window.document.body, []);
dispose(window.document, []);
dispose(window, []);
window.disposeAll = null;
window.dispose = null;
window.onunload = null;
}
function dispose(something, map) {
if (something == null) return;
if (something.dispose && typeof (something.dispose) == 'function') {
try { something.dispose(); } catch (e) { debugger; }
}
map.push(something);
for (var key in something) {
var value = null;
try { value = something[key]; } catch (e) { };
if (value == null || value == dispose || value == disposeAll) continue;
var processed = null;
for (var index = 0; index < map.length; index++) {
if (map[index] === value) {
processed = value;
break;
}
}
if (processed != null) continue;
var constructor = value.constructor;
if (constructor == Object || constructor == Array) {
try { dispose(value, map); } catch (e) { debugger; }
}
if (constructor == Object || constructor == Array || constructor == Function) {
try { something[key] = null; } catch (e) { debugger; }
}
}
map.pop();
}
(function() {
var previousUnloadHandler = window.onunload;
if (previousUnloadHandler == null) {
window.onunload = disposeAll;
} else {
window.onunload = function() {
previousUnloadHandler.apply(this, arguments); // <== HERE YOU MAY WANT TO HAVE AN "IF" TO MAKE SURE THE ORIGINAL UNLOAD EVENT WASN'T CANCELLED
disposeAll();
previousUnloadHandler = null;
};
}
}());
</script>
<![endif]-->
Вы можете удалить все «отладчика»; Заявления, если вам не хочется иметь дело с некоторыми случайными исключениями.
У вас утечка памяти из функций Java?
Вот решение:Возьмите свою домашнюю яву и выбросьте ее.Используйте одну из стандартных инфраструктур JavaScript, например jQuery.
Если вы пишете сложный JavaScript и не являетесь гуру Java, не делайте этого самостоятельно.
Редактировать:Что, это плохой совет?Javascript — это не просто язык сценариев;это сложный и удивительно мощный язык программирования, тесно связанный с HTML DOM, который по-разному реализован в разных браузерах.Если вы сделаете это неправильно, вы не только приведете к утечке памяти, но и повсюду выкинете ошибки и, как правило, ухудшите работу в Интернете.Вы хотите отпугнуть людей, заходящих на ваш сайт?Нет?Затем используйте фреймворк JavaScript и избавьтесь от всей этой хакерской кроссбраузерной ерунды.