Почему в Internet Explorer сохраняется утечка памяти даже при переходе со страниц?

В книге 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?


person nonopolarity    schedule 21.06.2010    source источник
comment
Многие программы имеют проблемы с утечкой памяти; и хотя многие утечки памяти были устранены в более новых версиях IE, сложно объединить их все в проекте такого размера.   -  person Piskvor left the building    schedule 21.06.2010


Ответы (2)


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

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

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

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

person Piskvor left the building    schedule 21.06.2010
comment
разве эти циклические ссылки не имеют области действия на уровне страницы? Итак, когда на этой странице происходит утечка памяти, и мы нажимаем Back и переходим на google.com, эта страница по существу исчезает из последовательности Back и Forward, и мы можем освободить всю память, связанную с этой страницей. - person nonopolarity; 21.06.2010
comment
@ Цзянь Линь: Да, так должно работать. Однако программист IE, вероятно, забыл проверить, все ли ссылки на страницы освобождены правильно, и поэтому, хотя IE думает, что он очистился правильно, он оставил некоторые данные в памяти и больше не знает о них. . - person Piskvor left the building; 21.06.2010
comment
@Jian: Было бы хорошо, если бы это сработало. Тот факт, что эта проблема сохраняется, указывает на то, что либо сборщик мусора считает, что память все еще используется правильно (хотя, возможно, по неожиданному маршруту), либо сборщик мусора слишком глуп, чтобы освободить память, либо даже что сборщика мусора нет. . Невозможно оценить, в чем проблема, без источника для IE (или его декомпиляции, что было бы слабым второстепенным). - person Donal Fellows; 21.06.2010
comment
з / программист / высокооплачиваемый архитектор, вышедший на пенсию и купивший где-то остров - person i_am_jorf; 21.06.2010
comment
@jeffamaphone: такого рода ошибки обычно появляются на гораздо более низком уровне, чем системная архитектура, я бы сказал s/programmer/lowly code monkey/;) - person Piskvor left the building; 21.06.2010
comment
Нет, в данном случае я так не думаю. JScript принадлежит DevDiv (ребята из VS), а MSHTML принадлежит команде IE. Я почти уверен, что проблема возникает из-за двух разных архитектур. - person i_am_jorf; 22.06.2010

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

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

  • Хранение ссылок на управляемые объекты
  • Неспособность освободить неуправляемые ресурсы
  • Неудача при удалении объектов чертежа
person amelvin    schedule 21.06.2010