память браузера постоянно увеличивается с помощью javascript ajax-вызовов - PullRequest
3 голосов
/ 09 марта 2010

У меня странное поведение. Я использую довольно тяжелую страницу (4000 узлов), предназначенную для отображения системы диспетчеризации для операций доставки. Каждые 30 сек. Я обновляю с помощью jquery, список операций (3000 узлов более 4000). Он работает на отлично, но ... каждый раз память как Firefox, так и Chrome увеличивается на 3-6ko. Конечно, через некоторое время браузер вылетает ...

У кого-нибудь есть идеи, почему? Это утечка памяти? Javascript где-то не удается? Я проверил, и после каждого обновления у меня одинаковое количество узлов, что означает, что замена выполняется правильно.

После каждой операции обновления я сбрасываю пару событий: вот пример

$("#orders_list .list_table_row").hover(
            function(){
            //  mouse over
                $(this).children().css("background-color","#E0E0E0");   
            },
            function(){
            //  mouse out
                $(this).children().css("background-color","");  
            });

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

Я нашел 2 интересные ссылки: http://www.javascriptkit.com/javatutors/closuresleak/index3.shtml и http://www.jibbering.com/faq/faq_notes/closures.html

Спасибо, Пол

Редакция 1 - добавлен пример кода и ссылки

Ответы [ 2 ]

4 голосов
/ 09 марта 2010

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

Попробуйте вместо этого использовать делегирование событий. Метод jQuery .live() - это то, что вы хотите. Это сделает обновления быстрее и уберет сложность обработчика событий и утечки.

Вместо $(".myclass").click(/*...*/) используйте $(".myclass").live("click", /*...*/). Вы должны сделать это только один раз, при загрузке страницы, и он будет работать для всех будущих элементов этого класса, даже после ваших обновлений ajax.

См. Документацию: http://api.jquery.com/live/

2 голосов
/ 09 марта 2010

Вы должны открепить (и предпочтительно уничтожить) обработчики событий перед удалением узлов, с которыми связаны эти события. В противном случае произойдет утечка памяти.
IE также имеет проблему с утечкой памяти при использовании замыканий, если замыкание в какой-то момент теряется и не уничтожается должным образом, в некоторых случаях сборщик мусора не сможет его забрать. Существует несколько инструментов для отслеживания утечек памяти (Firefox, один из которых отмечен выше в комментариях), IE Leak Detector , JavaScript утечка памяти
Еще немного информации об утечках памяти в браузерах (в основном IE):
Понимание и решение шаблонов утечки Internet Explorer
Закрытие течей в IE

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