Возникли проблемы с использованием IE Javascript детекторов утечки - PullRequest
7 голосов
/ 17 ноября 2010

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

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

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

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

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

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

1 Ответ

2 голосов
/ 17 ноября 2010

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

Самая распространенная утечка в 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 или где-либо еще, хотя closure ). Вам следует проверить места, где вы удаляете элементы, и выяснить, какие функции ссылаются на них.

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

...