当前位置: 首页 > 知识库问答 >
问题:

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

盛承
2023-03-14

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

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

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

共有1个答案

斜瑞
2023-03-14

没有什么可以阻止EventBus对象在没有更多引用时被垃圾收集。您可以查看源代码。

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

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

这些缓存的大小受限于您发送到每个< code>EventBus的不同类型事件的数量,以及您向每个< code>EventBus注册的不同类的数量。因此,举例来说,如果你只发布一种类型的事件,并且你只有一个用事件总线注册的类,那么缓存将会很小,并且保持不变。

 类似资料:
  • 问题内容: 首先,我想澄清一下我的理解,因为以下问题是相同的。 上面代码的输出是 这意味着,尽管一旦GC运行,实际的对象对象就会被垃圾回收,但是内存中仍然有一个类对象,该对象此时不指向任何对象。 现在考虑到上述理解为真,我对工作原理感到困惑。在下面的代码中 输出: 现在的 问题 是,据说输入是弱引用,这意味着在上面的代码中, 成为实际对象时可以进行垃圾回收,因为不再有对该对象的强引用,但是 和作为

  • 有人能给我解释一下原因吗?

  • 问题内容: 我有一段代码可以在内存中加载很大的图像。所以打电话似乎是合理的事情 在加载图像之前。据我所知,它毫无问题。 昨天,我决定使用一个名为FindBugs的非常有用的软件来扫描您的代码并报告可能导致错误或通常不建议使用的策略的问题。问题是我提到的这段代码得到了报告。描述是这样的: …强迫垃圾收集;除了基准测试代码外,都非常可疑 并继续阐述: 代码显式调用垃圾回收。除了基准测试中的特定用途外,

  • [GC(分配失败)[defnew:10931K->472K(12288K),0.0053905秒]10931K->10712K(39616K),0.0054285秒][times:user=0.00 sys=0.00,real=0.01秒] [GC(分配失败)[defnew:10712k->472k(12288k),0.0057686秒]20952k->20952k(39616k),0.00580

  • 问题内容: 如何防止对象收集垃圾? 是否有通过终结或幻影引用的方法或任何其他方法? 采访中有人问我这个问题。面试官建议可以使用。 问题答案: 保持参考。如果过早地收集了对象,则表明您的应用程序设计中存在错误。 垃圾收集器仅收集应用程序中没有引用的对象。如果没有可以自然引用所收集对象的对象,请问自己为什么要保持它的生命。 通常没有引用但想要保留一个对象的一个​​用例是单例。在这种情况下,您可以使用静

  • 在下面的代码中,假设调用了。最初引用的对象在哪一点/哪一行符合垃圾收集的条件? 如果或有一个公共、受保护、默认或静态的访问修饰符,它会影响对象在什么点上有资格进行垃圾收集吗?如果是,它会受到什么影响? 我的第一个想法是,当测试对象有资格进行垃圾收集时,该对象有资格进行垃圾收集