Сборка "мусора" статических участников

Ваш метод получения get translationsAsArray$() возвращает новый объект Observable каждый раз, когда он вызывается. Канал Angular async видит новую ссылку на объект, поэтому он подписывается на новую наблюдаемую.

get observableObj() {
  // Returns a new object each time
  return timer(50);
}

constructor() {
  console.log('Testing Observable reference equality');
  const obj1 = this.observableObj;
  const obj2 = this.observableObj;
  console.log('Different Object references?', obj1 !== obj2); // true
}

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

Для этого измените геттер на обычное свойство объекта:

book.translationsAsArray$ = timer(50).pipe(
  tap(time => console.log('translationsAsArray subscribed')),
  map(time => ['abc'])
)

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

Демонстрация StackBlitz.

10
задан splattne 12 May 2009 в 06:19
поделиться

3 ответа

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

In ASP.NET, « повторное использование домена приложений » происходит периодически (по разным причинам) - когда это происходит, и статические переменные в этом домене приложений больше не будут действовать как корни сборки мусора и, таким образом, выиграли не предотвращает сборку мусора.

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

19
ответ дан 3 December 2019 в 16:10
поделиться

Члены не собираются ... Объекты.
Так что если вы установите Ref. Введите static member в null, будет собран любой объект, на который он ранее указывал. В противном случае он будет зависать, пока AppDomain не выйдет из строя (каждый AppDomain имеет свой собственный набор статических данных)

5
ответ дан 3 December 2019 в 16:10
поделиться

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

0
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: