Почему в Internet Explorer сохраняется утечка памяти даже при переходе от страниц? - PullRequest
6 голосов
/ 21 июня 2010

В книге Learning jQuery говорится, что IE имеет утечку памяти для объекта DOM, имеющего свойство, ссылающееся на функцию, и функцию, также ссылающуюся на объект DOM, таким образом, имея "круговую ссылку", например:

onload = function() {
    var foo = document.getElementById('foo');
    foo.onclick = function() {  // DOM object foo's onclick property refers to a function
       foo.innerHTML = "hello"  // the function's body refers to the DOM object
    }                           // therefore circular reference
}

IE может обрабатывать циклические ссылки для сборки мусора, но не тогда, когда циклические ссылки включают в себя как объект DOM, так и объект Javascript, потому что они обрабатываются различными менеджерами памяти.

и

[утечка памяти ... и] в результате [ссылка] цикл не может быть освобожден IE, даже когда мы уходим от страница.

никогда не освобождается, пока браузер не будет закрыт.

Это правда? Почему IE не освобождает эту память, даже когда пользователь покидает страницу? Это потому, что пользователь может нажать Back и вернуться на страницу, а IE хотел бы сохранить состояние страницы? В таком случае, что если пользователь находится на странице утечки памяти, а затем нажимает Back и затем переходит на google.com? Тогда страница не может быть просмотрена никакими Back или Forward, и проблема утечки памяти может исчезнуть без закрытия браузера?

Или даже когда вкладка закрыта, не закрывая браузер?

Такая утечка памяти также происходит в IE 8?

Ответы [ 2 ]

4 голосов
/ 21 июня 2010

Утечки памяти - это класс программных ошибок, поэтому вы спрашиваете «почему IE глючит?». Ответ на этот вопрос, очевидно, «потому что программист где-то допустил ошибку».

В то время как некоторые браузеры намеренно сохраняют состояние страницы, даже если вы уходите от нее (особенно Opera и FF), «утечка памяти» означает память, которую программа больше не использует, но забыла освободить. В этом случае IE прекратил заботиться об этой части памяти, но не сказал об этом ОС (Windows), которая все еще считает ее «используемой IE». Таким образом, эта часть памяти висит на ничейной земле, пока браузер не будет закрыт - потому что при выходе из процесса браузера ОС помечает всю память, выделенную этому процессу, как «свободную».

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

См. Например http://en.wikipedia.org/wiki/Circular_reference и http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) для дальнейшего чтения по этой теме.

1 голос
/ 21 июня 2010

Утечка произошла из-за того, что одному из программистов приложения (в данном случае IE) не удалось правильно распорядиться чем-то (объектом, ресурсом), использующим память.

В MSDN рассматриваются три наиболее распространенные причины утечек в управляемых приложениях :

  • Хранение ссылок на управляемые объекты
  • Не удалось освободить неуправляемые ресурсы
  • Невозможность утилизировать объекты рисования
...