gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:56 24 4
gpt4 key购买 nike

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

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

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

最佳答案

没有什么可以阻止 EventBus 对象在没有更多引用时被垃圾收集。你可以看看source code .

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

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

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

关于java - Google Guava EventBus 对象何时被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19132042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com