У этого кода есть утечка памяти? Если так, как я могу удалить это? - PullRequest
1 голос
/ 24 июля 2011

Мне дали проект, над которым работали мои старшие, этот проект разработан с учетом того, что всю страницу никогда не следует перезагружать.Так что, очевидно, все вошло в Аякс.И у него есть 100 строк, которые выглядят примерно так:

 function iCreateProblems()
    {
        //some rubbish
        document.getElementById('some_rubbish').innerHTML=obj1.responseText;
    }

и типичный текст ответа: "<div onClick="handleMe()">some thing stupid</div>"; На странице три основных элемента div, и все они повторно загружаются и загружаются в эти элементы div.Теперь, насколько я понимаю, это явно приведет к утечке памяти, верно?Так как мне это исправить?Есть около 8000 строк кода, которые идут таким образом.Есть ли способ исправить утечку памяти?Есть сотни обработчиков, которые назначены так.Что мне теперь делать?

Ответы [ 2 ]

1 голос
/ 24 июля 2011

Не видя остальную часть кода, невозможно сказать.Несмотря на то, что люди говорят здесь, очень легко создать утечку памяти в JS и не заметить ее.Обычно JS сборщики мусора помечают переменные, которые «достижимы».Переменные становятся «недоступными», когда их «отметка» снимается и не применяется повторно (то есть они совершенно недоступны для любой из функций или областей действия программиста).После удаления метки они в конечном итоге очищаются сборщиком мусора.

Одним из надуманных примеров утечки памяти будет:

(function() {
  var xhr = $.get('http://google.com/');
  $('a').click(function() {
    console.log('hello');
  });
})();

Пока этот элемент существует на странице, с привязанным к нему прослушивателем событий, переменная xhr будет никогда быть очищенным сборщиком мусора.Даже если xhr никогда не используется где-либо в вашем коде, сборщик мусора откажется его очищать, потому что он все еще «доступен» слушателю событий.возможность утечки памяти из-за ошибок в плохо написанном движке JS.(См. Также: Internet Explorer).Большинство библиотек DOM учитывают это и стараются избегать этих проблем, но это все же может произойти.Для этих утечек памяти вам нужно найти обходной путь для этого конкретного двигателя.

1 голос
/ 24 июля 2011

Нет, не должно.Вы не обрабатываете память непосредственно в js;сборщики мусора удаляют все ненужное, и вам не нужно явно удалять содержимое div, если вы перезаписываете содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...