2013-10-02 2 views
4

У меня есть веб-приложение, которое порождает большое количество потоков рабочего потока в ответ на запросы к определенной конечной точке. Чтобы обеспечить большую прозрачность в отношении состояния рабочих, я добавил автобус событий, на который рабочие могут отправлять события. События переносятся на карту, отслеживая состояние каждого работника с течением времени. Периодически карта снимается и перемещается в более постоянное место, где моментальные снимки связаны с запросом через токен запроса.Когда собираются объекты мусора Google Guava EventBus?

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

По крайней мере, это теория. Но некоторые люди, с которыми я говорил, предположили, что автобус событий не будет собран, даже если единственная явная ссылка на него выходит за рамки, потому что ему удается создавать другие ссылки для себя во время установки. Я был бы очень признателен за более опытную точку зрения практикующего Java/Guava.

+1

Я не мог найти ничего подобного в документации ....: - | Являются ли ваши источники достоверными? – Thihara

+0

Я также видел, что нити не были выпущены, как только будет обработано событие. Буду признателен за любые замечания по этому поводу. – RohanRasane

ответ

3

Нет ничего, что предотвращало бы объекты EventBus от сбора мусора, если на них больше нет ссылок. Вы можете посмотреть на source code.

Что они могут иметь в виду тот факт, что EventBus имеет несколько static кэшей, которые являются общими EventBus экземплярами. Это не будет сбор мусора. В тайниках сделать две вещи:

  • EventBus.flattenHierarchyCache хранит карту классов (типов событий ваши методы абонентские подписаться) на множестве всех классов и интерфейсов, каждый из этих классов распространяется или орудий.
  • AnnotatedSubscriberFinder.subscriberMethodsCache хранит карту классов (классы, которые имеют методы подписчиков) для методов на тех классах, которые аннотируются с помощью @Subscribe.

Размер этих кэшей ограничивается числом различных типов событий, которые вы добавите к каждому EventBus и число различных классов, которые вы зарегистрировались с каждым EventBus. Так, например, если вы публикуете только один тип событий, и у вас есть только один класс, который вы регистрируете на своих автобусах событий, кеши будут крошечными и будут оставаться такими.

Смежные вопросы