Сведения о вопросе

rjevskii

04:54, 3rd August, 2020

Теги

Огромное веб-приложение с утечкой памяти в IE 6

Просмотров: 511   Ответов: 4

У меня есть огромное веб-приложение, которое имеет проблемы с утечкой памяти в IE 6.

Исправление утечки памяти в примере кода 5 строк, демонстрирующем проблему, легко.

Но если у меня есть очень большое приложение, с чего начать?



  Сведения об ответе

ASSembler

04:38, 24th August, 2020

Проверьте капельницу . Это обычно снимает догадки об утечках памяти IE.

Если по какой-то причине Drip не находит его, внимательно посмотрите на любой код JavaScript, который работает с событиями. Это почти всегда является источником любой значительной утечки памяти в браузере.

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


  Сведения об ответе

baggs

12:53, 29th August, 2020

Использует ли приложение много JavaScript?

Если это так, то я обнаружил, что одна вещь, которая помогает избежать утечек памяти,-это убедиться, что вы используете фреймворк JavaScript, такой как Prototype или jQuery, потому что у них есть испытанный код обработки событий, который не пропускает память.


  Сведения об ответе

VCe znayu

17:35, 6th August, 2020

Вот как я решил проблему утечки памяти в IE7. Идея заключается в том, чтобы при выгрузке страницы расположить/установить в null все свойства expando на всех узлах 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]-->

Вы можете удалить все операторы "debugger;", если не хотите иметь дело с некоторыми случайными исключениями.


  Сведения об ответе

PAGE

16:40, 24th August, 2020

У вас происходит утечка памяти из Java функции?

Вот вам решение: возьмите свой homebrew java и выбросьте его. Используйте один из стандартных фреймворков javascript, например jQuery.

Если вы занимаетесь комплексом javascript и не являетесь гуру java, не делайте этого сами.

Edit: что, это плохой совет? Javascript-это не просто простой язык сценариев; это сложный и удивительно мощный язык программирования, который тесно связан с HTML DOM, который реализован по-разному в разных браузерах. Если вы сделаете это неправильно,вы не только утечка памяти, но и бросать ошибки везде и вообще сделать опыт просмотра ужасно. Вы хотите, чтобы отогнать людей, приходящих на ваш сайт? - Нет? Затем используйте фреймворк javascript и избавьтесь от всей своей хаки-кроссбраузерной ерунды.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться