2013-10-02 5 views
4

특정 끝점에 대한 요청에 대한 응답으로 많은 백그라운드 작업자 스레드를 생성하는 웹 응용 프로그램이 있습니다. 근로자들의 상태를보다 투명하게 볼 수 있도록, 나는 근로자들이 이벤트를 게시 할 수있는 이벤트 버스를 추가했다. 이벤트는 시간이 지남에 따라 각 작업자의 상태를 추적하여 맵에 푸시됩니다. 주기적으로 맵은 스냅 샷되고보다 영구적 인 위치로 푸시됩니다. 여기서 스냅 샷은 요청 토큰을 통해 요청과 연관됩니다.Google Guava EventBus 객체는 언제 가비지 수집됩니까?

각 요청에 자체 이벤트 버스를 제공하는 것은 분명 매력적입니다. 그런 다음 각 요청은 자체 맵을 얻습니다. 요청이 완료되고 최종 스냅 샷이 푸시되면 맵과 이벤트 버스는 범위를 벗어나 가비지 수집됩니다.

적어도 그것이 이론입니다. 그러나 내가 이야기 한 일부 사람들은 이벤트 버스가 설정 중에 다른 참조를 생성하기 때문에 이벤트 버스가 명시적인 참조가 범위를 벗어나는 경우에도 수집되지 않을 것이라고 제안했습니다. 나는 경험 많은 Java/Guava 실무자의 관점에 정말로 감사 할 것입니다.

+1

문서에서 그와 같은 것을 찾을 수 없습니다 .... : - | 당신의 출처는 믿을만한가요? – Thihara

+0

이벤트가 처리 되 자마자 스레드가 해제 된 것도 보았습니다. 그것에 대한 의견을 보내 주시면 감사하겠습니다. – RohanRasane

답변

3

더 이상 참조가 없을 때 EventBus 개체가 가비지 수집되지 않도록하는 것은 없습니다. source code을 살펴볼 수 있습니다.

는 그들이 참조 할 수 수 것은 EventBusEventBus 인스턴스간에 공유되는 static 캐시의 몇 가지를 가지고 있다는 사실이다. 그 쓰레기 수집되지 않습니다.

  • EventBus.flattenHierarchyCache는 해당 클래스의 각 확장하거나 구현하는 모든 클래스 및 인터페이스의 세트 클래스의지도 (당신의 가입자 방법에 가입 이벤트의 유형을) 유지 : 캐시 두 가지 작업을 수행.
  • AnnotatedSubscriberFinder.subscriberMethodsCache은 클래스 (사용자 메소드가있는 클래스)의 맵을 @Subscribe으로 주석 된 클래스의 메소드에 유지합니다.

이러한 캐시의 크기는 각 EventBus에 게시되는 다양한 종류의 이벤트의 수와 각 EventBus에 등록 다른 클래스의 숫자로 제한됩니다. 예를 들어 한 가지 유형의 이벤트 만 게시하고 이벤트 버스에 등록한 클래스가 하나 뿐인 경우 캐시는 작아서 그대로 유지됩니다.

관련 문제