Очистка после того, как объект был собран мусором - PullRequest
1 голос
/ 22 января 2020

Я работаю над библиотекой, которая имеет:

  • Некоторые довольно сложные циклические ссылки.
  • Регистрирует различные прослушиватели событий.
  • Использует некоторые ( объекты в единственном стиле) для глобальных кэшей

Эти свойства означают, что куча вещей в моем приложении вряд ли будет автоматически собрана сборщиком мусора.

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

В PHP для этого можно использовать метод __destruct цель. Возможен ли подобный механизм в Javascript?

Вообще говоря, это был бы вымышленный пример моего графика зависимостей:

Parent
  - childA
  - childB

Parent в этом сценарии имеет только внешние ссылки так что Javascript может G C этот объект, если он больше не используется, но когда это произойдет, я бы хотел, чтобы Parent сообщил обоим childA и childB, что они могут отменить регистрацию своих обработчиков событий и выполнить дополнительную очистку .

Конечно, я мог бы добавить метод release() или destroy() к родителю, но я бы хотел, чтобы это работало, не требуя от конечного пользователя явного указания родителю.

Ответы [ 2 ]

1 голос
/ 22 января 2020

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

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

См. Также https://v8.dev/features/weak-references. Я не вижу никаких заявлений о том, что node.js уже поддерживает это.

0 голосов
/ 22 января 2020

Согласно этот вопрос SO и в этом блоге v8 node.js не выполняет подсчет ссылок, а вместо этого использует полный стиль сбора мусора с разметкой и уборкой.

Это означает, что сборщик мусора запускается с фрейма выполнения и объекта global и пересекает все ссылки, помечая их как достижимые. После этого он помечает все области памяти, которые не были доступны, как «свободное пространство». Даже если ваша библиотека имеет большое количество циклических ссылок и прослушивателей событий, если целый блок ссылок / сам источник событий недоступен, все это будет потрясено меткой и размахом.

Вы как правило, беспокоиться не о чем, так как сборщик мусора в v8 достаточно надежен, но все же стоит помнить о необходимости выпуска ссылок, которые больше не нужны, когда это необходимо (или обеспечения короткого времени существования ссылок или других подобных методов).

...