2016-11-29 8 views
-1

Я получаю jQuery.Deferred где-то в своем коде, и добавляю к нему несколько обратных вызовов, которые являются членами методов недолговечных объектов. Мне было интересно, есть ли какой-либо потенциал утечки памяти в этой ситуации, подобно тому, как в обработчиках событий .NET.Существуют ли потенциальные утечки памяти при использовании отложенных данных?

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

Не могли бы вы пролить свет на эту тему?

EDIT

Как я думаю об этом, это сужает к этому вопросу. В JavaScript будет содержать ссылку на функцию-член объекта (а не прототип), чтобы объект не был GC-d? Поскольку jQuery, похоже, удерживает эти ссылки функций в обратных вызовах отложенного объекта.

+0

Я не уверен, как ответить на этот вопрос. На любом языке, который может содержать ссылку, существует риск утечки памяти. Это все о том, где вы берете эти ссылки и как они вписываются в дерево, на которое будет смотреть GC. – ssube

+0

Мой вопрос в том, как jQuery внутренне обрабатывает его, делает ли он отложенный объект каким-то образом в какой-то момент и т. Д. –

+0

Это может помочь: https://auth0.com/blog/four-types-of-leaks-in -your-javascript-code-and-how-to-get-rid-of-them/ – Sparrow

ответ

1

Я не видел никакой части, в которой были удалены обратные вызовы.

Обратные вызовы очищаются, когда обещание установлено (выполнено или отклонено).

Я даже не нашел, где должен заканчиваться жизненный цикл отложенного объекта.

Жизненный цикл обещания заканчивается, когда ничто не содержит ссылки на него.

В целом есть две вещи, которые содержат ссылку на него: резольвер (например, тайм-аут, запрос ajax и т. Д.), Которые в конечном итоге уладят обещание, и сущности, которые сохраняют обещание, потому что они хотят использовать его (то есть его результат) позже.Объект обещания, в свою очередь, содержит ссылку на все обратные вызовы (до тех пор, пока они не установлены), и на значение результата (после его установки).

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

В JavaScript будет содержать ссылку на функцию-член объекта (а не прототип), чтобы объект не был GC-d?

Нет, в общем нет. В javascript нет «членов», просто автономных функций.

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

+0

Спасибо, я рад, что мой собственный ответ в основном согласуется с вашим. Я работаю каждый день как с .NET, так и с JS, и иногда я сбиваюсь с толку. –

+0

Для записи - термин «участники» используется в javascript, особенно Douglas Crockford, например [здесь] (http://www.crockford.com/javascript/private.html), хотя значение отличается от значения, подразумеваемого ОП. –

0

Из того, что я видел (и некоторый свет чтения: Do never resolved promises cause memory leak?), есть ничтожна эффект от неразрешенных Promises - или Deferrered с - если вы не:

  • Создание большого числа: сотни экземпляров любого объекта являются тормозом, который требует специальной обработки и дизайна
  • Ведения ссылок на экземпляры, которые мешают GC бежать от очистки любых из собственного объема предметов
1

Я отвечу на свой вопрос, потому что он кажется простым после некоторого размышления. На самом деле функции JavaScript не относятся «строго» к объектам, где они определены, если только они не связаны вручную с Function.prototype.bind, но это другой случай.

Так что, если функции живут своей жизнью, ссылка на них не должна отрицать сбор объекта, где он был первоначально определен.

Также я должен отметить, что все это даже не имеет значения, если я не располагаю прямой или закрытой ссылкой на объект отложенного объекта, потому что тогда всякий раз, когда это делается, задание (разрешено/отклонено), оно будет собираемым ,

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