Может ли jQuery.data вызвать утечку памяти? - PullRequest
11 голосов
/ 16 августа 2011

Может ли следующий фрагмент кода вызвать утечку памяти.

Согласно документации jQuery использование функции data позволяет избежать утечек памяти. Было бы полезно проверить, безопасно ли следующее.

var MyClass = function(el) {
    // Store reference of element in object.
    this.element = $(el);
};

// Store reference of object in element.
$('#something').data('obj', new MyClass('#something'));

Ответы [ 4 ]

7 голосов
/ 16 августа 2011

Очевидно, что код в его нынешнем виде занимал бы дополнительную память, пока элемент DOM все еще подключен к DOM. Но я предполагаю, что вы спрашиваете, будет ли он продолжать использовать дополнительную память после того, как элемент DOM больше не используется.

Обновление : Благодаря ответу Джоуи (который он с тех пор удалил) я потратил некоторое время на чтение утечек памяти в javascript , и мои предположения приведены в параграфе ниже неверны. Поскольку элементы DOM не используют чистую сборку мусора, круговая ссылка, подобная этой, обычно предотвращает выпуск как элемента DOM, так и объекта javascript. Тем не менее, я считаю, что остальная часть этого ответа все еще верна.

Без глубоких знаний о том, как движки javascript реализуют сборку мусора, я не могу авторитетно говорить на эту тему. Однако мое общее понимание сборки мусора заставляет меня думать, что ваш код будет «безопасным» в том смысле, что после удаления элемента #something из DOM полученный объект MyClass будет иметь только ссылку на объект, который не имеет других связей. Алгоритмы графов сборщика мусора должны быть в состоянии определить, что элемент DOM и его объект MyClass "плавают в пространстве" и не связаны со всем остальным.

Кроме того, jQuery делает все возможное для удаления данных и событий, связанных с данным элементом DOM, после его удаления из DOM. Из документации :

jQuery обеспечивает удаление данных при удалении элементов DOM с помощью методов jQuery и при выходе пользователя из страницы.

Таким образом, предполагая, что вы используете jQuery последовательно, вы получите одностороннюю ссылку только после того, как объект все равно будет удален из DOM, что делает намного более легким возможным для сборщика мусора, чтобы узнать, что он может избавиться от этих предметов.

Так что, если у вас больше нет ссылок на объект MyClass после удаления элемента DOM, утечки памяти не должно быть.

0 голосов
/ 23 июня 2017

Это может привести к утечке памяти.теория метода jQuery.data может использовать внутренний класс Data для кэширования данных для элемента dom.

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

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

0 голосов
/ 16 августа 2011

Полагаю, это зависит от движка Javascritp.

У вас есть вопрос, который вам нужен для выполнения теста.Я добавил длинную строку в объект и запустил потенциальную утечку в большом цикле.

В результате я не думаю о утечках ни в IE8, ни в Chrome.

Но я могне воспроизводить эти схемы утечки .

0 голосов
/ 16 августа 2011

Атрибут данных хранит только строковые значения.

...