Google Guava EventBus对象何时被垃圾收集?

时间:2013-10-02 07:36:51

标签: java guava

我有一个Web应用程序,它会响应对某个端点的请求而产生大量后台工作线程。为了提高工人状态的透明度,我添加了一个工作人员可以发布事件的事件总线。事件被推入地图,跟踪每个工人的状态。会定期对地图进行快照并将其推送到更永久的位置,快照通过请求令牌与请求相关联。

为每个请求提供自己的事件总线肯定很有吸引力。然后每个请求都有自己的地图。当请求完成并推送最终快照时,地图和事件总线超出范围,因此被垃圾收集。

至少,这就是理论。但是我曾经谈过的一些人建议事件总线不会被收集,即使它唯一明确的引用超出范围,因为它设法在设置期间为自己创建其他引用。我非常感谢更有经验的Java / Guava从业者的观点。

1 个答案:

答案 0 :(得分:3)

当没有更多对它们的引用时,没有任何东西阻止EventBus个对象被垃圾回收。您可以查看source code

他们可能指的是EventBusstatic个实例之间共享的几个EventBus缓存这一事实。那些不会被垃圾收集。缓存做了两件事:

  • EventBus.flattenHierarchyCache将类的映射(订阅者方法订阅的事件的类型)保存到所有类和接口的集合中,每个类都扩展或实现。
  • AnnotatedSubscriberFinder.subscriberMethodsCache将类的映射(具有订阅者方法的类)保存到那些使用@Subscribe注释的类上的方法。

这些缓存的大小受限于您​​发布到每个EventBus的不同类型的事件的数量以及您为每个EventBus注册的不同类的数量。因此,举例来说,如果您只发布一种类型的事件,并且您只有一个类可以使用事件总线注册,则缓存将很小并且将保持这种状态。