Огромный Web App С утечек памяти в IE 6


3

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

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

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

7

Отъезд Drip. Это обычно приводит к угадыванию утечек IE.

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

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


1

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

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


-3

Вы утечки памяти из функций Java?

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

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

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

  0

Я не модерировал вас, но в некоторых случаях сам jQuery имеет утечки памяти, а также пользовательский интерфейс jQuery. По крайней мере, с версией 1.3.2 ... 12 май. 092009-05-12 22:40:59


0

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

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