Насколько вероятны утечки памяти с помощью jQuery? - PullRequest
1 голос
/ 21 марта 2011

Представьте себе, я создаю сложный интерфейс с использованием jQuery / AJAX и хочу, чтобы приложение с этим интерфейсом было открыто в течение всего дня.Он активно работает с AJAX, строит его элементы, удаляет другие, меняет позиции и размеры и т. Д. Насколько вероятны утечки памяти или задержки браузера в этом сценарии?Как мне лучше обращаться с данными и кодом, чтобы избежать чрезмерного использования памяти?Есть ли какие-либо проблемы со стороны браузера, с которыми я могу столкнуться?

Ответы [ 4 ]

5 голосов
/ 21 марта 2011

jQuery сам по себе неплохо справляется с очисткой после себя элементов, связанных в событиях и т. Д. Тем не менее, все еще легко пропустить события и т. Д., Удаляя объекты вне jQuery. Например:

$('#someDiv a').bind('click', function(){ ... });
$('#someDiv').html('foo');

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

Вы также можете легко утечь с любой из существующих моделей утечек, которых есть много: круговые ссылки и т. Д. Многие из которых вызваны замыканиями.

Google "шаблоны утечки JavaScript" для информации.

0 голосов
/ 22 марта 2011

jQuery очень осторожен с утечками памяти, например:
(я показываю фрагменты кода из 1.3.2, я ожидаю, что более поздние версии будут столь же осторожны)
Когда вы устанавливаете innerHTML узла в'' при использовании .html('') происходят следующие вещи

/**** jQuery's html method ****/
html: function( value ) {
    return value === undefined ?
        (this[0] ?
            this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
            null) :
        /**** This bit will call empty on the node ****/
        this.empty().append( value );
},

/**** jQuery's empty method ****/
empty: function() {
    /**** this bit removes all dom nodes that are children ****/
    // Remove element nodes and prevent memory leaks
    jQuery(this).children().remove();

    /**** this bit just gets rid of text nodes ****/
    // Remove any remaining nodes
    while ( this.firstChild )
        this.removeChild( this.firstChild );
}

/**** jQuery's remove method ****/
remove: function( selector ) {
    if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
        // Prevent memory leaks
        jQuery( "*", this ).add([this]).each(function(){

            /**** This is the important bit, all events and all data  ****/
            /**** including references to other objects and nodes are removed  ****/
            /**** Sweet! ****/
            jQuery.event.remove(this);
            jQuery.removeData(this);
        });
        if (this.parentNode)
            this.parentNode.removeChild( this );
        }
}, 

Я вполне уверен, что jQuery справится с задачей предотвращения утечек памяти.Конечно, если вы сделаете что-то вроде удаления контента с помощью innerHTML, вы потеряете это преимущество.Это не значит, что вы не должны этого делать, это более эффективно, но вам либо не нужно заботиться о возможных утечках, либо быть уверенным в том, что к дочерним узлам не прикреплены события или данные.

0 голосов
/ 21 марта 2011

Это будет зависеть от браузера.В jQuery нет утечек памяти, о которых я знаю, но я знаю, что в некоторых браузерах закрытия могут вызывать утечки.Я имею в виду, что вы должны беспокоиться об утечках памяти, но, вероятно, не из jQuery.

Предотвращение утечек памяти может быть очень трудным, особенно когда приложение работает в переменной среде.Запускайте ваше приложение в разных браузерах в течение длительного времени и отслеживайте использование памяти для каждого - таким образом вы можете определить объем утечки памяти, а если у вас возникнут проблемы, вы можете попытаться ее исправить.

Вообще говоряВы должны относиться к утечкам так же, как к оптимизации.То есть: заставить это работать, затем сделать это быстро => заставить это работать, затем сделайте это легким.

Надеюсь, это поможет:)

0 голосов
/ 21 марта 2011

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

Однако jQuery не должен подвергаться утечкам памяти, если только в браузере нет, но нет.

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