4

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

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

至少,理论上是这样的。但与我交谈过的一些人建议,即使对它的唯一显式引用超出范围,也不会收集事件总线,因为它在设置期间设法为自己创建其他引用。我真的很感激有经验的 Java/Guava 从业者的观点。

4

1 回答 1

3

EventBus当不再引用对象时,没有什么可以阻止对象被垃圾收集。你可以看看源代码

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

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

这些缓存的大小受到您发布到每个缓存的不同类型事件EventBus的数量以及您在每个缓存中注册的不同类的数量的限制EventBus。因此,例如,如果您只发布一种类型的事件,并且您只有一个在事件总线上注册的类,那么缓存将很小并且会保持这种状态。

于 2013-10-02T16:02:18.373 回答