Проблемы с использованием детекторов утечек IE Javascript

Браузеры Microsoft IE6 и IE7 страдают от утечек памяти при использовании определенных шаблонов кода Javascript. Я нашел много информации о характере утечек еще в ранние дни IE6. Однако я понимаю, что многие (но не все) из них были исправлены в IE7 и в пакете обновлений для IE6. Я не могу найти надежный источник информации о том, какие утечки все еще остаются в этих пропатченных версиях IE6 и IE7.

Есть несколько инструментов для обнаружения моделей утечек. Но я не могу использовать их так, как хочу!

  • Детектор утечек памяти Microsoft (V2) вообще не находит утечек в моем коде, даже когда я использую шаблоны, которые должны протекать. Это может быть из-за того, что я использую IE8 - есть ли какой-нибудь не головокружительный способ заставить его притворяться IE6 или IE7?

  • Drip and sIEve, кажется, находит множество утечек «бесхозного» типа. Конечно, это должны быть ложные срабатывания - практически каждый элемент, который я добавляю в документ, а затем снова удаляю, указан, и я не верю, что сохраняю ссылки на них. И если они настоящие, как я могу найти, где в моем коде они утекают? Инструменты имеют функцию «свойства», которая ничего не показывает, из-за чего она кажется сломанной. Опять же, я понятия не имею, относятся ли эти утечки к IE6 или IE7, или только к IE8, версии IE, которую я установил.

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

Любая помощь?


person thomasrutter    schedule 17.11.2010    source источник
comment
Спасибо за ответ galambalazs! Я разочарован тем, что награда в 250 баллов не принесла мне больше ответов...   -  person thomasrutter    schedule 26.11.2010


Ответы (1)


Я не думаю, что существует эффективный инструмент для обнаружения утечек памяти. Однако существует программа, которую вы можете использовать для эмуляции IE 6-7-8 на своем ПК, она называется Тестер IE.

Самая распространенная утечка в Internet Explorer — это взаимодействие с JScript.

Когда объект DOM содержит ссылку на объект JavaScript (например, функцию обработки событий) и когда этот объект JavaScript содержит ссылку на этот объект DOM, формируется циклическая структура. - http://javascript.crockford.com/memory/leak.html

Эта циклическая структура — то, с чем IE приходится нелегко. Вы должны понимать, как формируются циклические ссылки (посредством замыкания). Первым шагом будет очистка элементов DOM перед их удалением.

Это можно сделать с помощью такой общей функции:

function purge(d) {
    var a = d.attributes, i, l, n;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') {
                d[n] = null;
            }
        }
    }
    a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            purge(d.childNodes[i]);
        }
    }
}

Каждый раз, когда вы удаляете элементы из DOM, вам нужно сначала использовать purge. Вы даже можете написать обертку для этого

function safeRemove(el) {
  purge(el);
  el.parentNode.removeChild(el);
}

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

Эта проблема все еще существует в IE 6-7-8.

person gblazex    schedule 17.11.2010
comment
Делает ли jquery это из коробки, когда вы вызываете .remove()? - person Emil Ivanov; 25.11.2010
comment
Хороший вопрос. Я протестировал его, и для событий, которые вы добавили через jQuery, все в порядке, но события, добавленные любым другим способом, кажутся утечками (с jQuery remove). - person gblazex; 26.11.2010