java - 另一个强制 Java 垃圾收集问题(*我认为*是一个合理的用例)

标签 java garbage-collection

我有一个数据生成器,它生成的数据供许多不同的消费者使用(我们称它们为 Cs)。每个 C 都有自己感兴趣的数据集。数据生产者对 C 有弱引用,因此可以通知它们进行更新。

每个 C 也由许多独立的组件使用,因此没有一个组件可以判断何时不再需要 C,因此我们必须将其留给 JVM 来确定 C 何时可以进行 GC。

此处的目标是在 C 过时时收到通知,因此数据生产者可以关闭仅对未使用的 C 感兴趣的数据。

正如我之前提到的,数据生产者总是对 C 有弱引用,所以当 C 被 GC 时很容易做到这一点。但是,我注意到 Cs 通常会在 VM 中停留很长时间,然后才会最终进行 GC 处理,而在这期间,数据生成器正在生成大量本应需要的数据。

我有什么办法可以强制 GC 未使用的 C 吗?我希望是,但我希望不会,所以作为后续问题,有人对我如何(重新)设计它以使其更好/更有效地工作有好的建议吗?

谢谢!!

下面的一些答案提出了很多要点 - 特别是强制 C 用户订阅和取消订阅的建议。这很难,因为:

C 只是接口(interface) I(没有此订阅要求)的一种可能实现,这是用户真正使用的。 C 实现是在运行时注入(inject)的,所以我们不能强制用户遵守 C 特定的要求。 (哎哟?)

最佳答案

使用 C 的组件可以在感兴趣和不再感兴趣时发出通知。

当至少有一个感兴趣的组件时,开启订阅。 (这里没有出现之前的情况),当最后一个组件取消订阅时,关闭数据。

Set<C> components = ...

public void subscribesTo(C component) {
   if (components.isEmpty()) 
      enableSubscription();
   components.add(component);
}

public void unsubscribeFrom(C component) {
   components.remove(component);
   if (components.isEmpty()) 
      disableSubscription();
}

关于java - 另一个强制 Java 垃圾收集问题(*我认为*是一个合理的用例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5039349/

相关文章:

c - 用 C 实现的解释器中的垃圾收集问题

java - G1GC 奇怪的行为

python - 判断对象是否已经完成

java - 属性测试器在第二个编辑器页面上不起作用

java - 重写 HashMap 实现的 equals() 和 hashCode() 方法

java - 如何在 Gradle 中正确设置额外属性?

java - java GC 是怎么回事? PermGen 空间快满了?

java - Java 中的垃圾收集示例?

java - 如何验证给定类的特定构造函数是否被调用?

java - 访问线程以从另一个方法通知它(Android 应用程序)