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

每个C还由许多独立的组件使用,因此没有一个组件可以告诉您何时不再需要C,因此我们必须将其留给JVM以确定C在何时可以用于GC。

这里的目标是在C变得过时时得到通知,以便数据生成器可以关闭仅对未使用的C感兴趣的数据。

正如我前面提到的,数据生产者对C的引用总是很弱,因此在对C进行GC时很容易做到。但是,我注意到,C通常会在VM中停留很长一段时间,直到最终进行GC处理,而与此同时,数据生产者正在生成大量它本应需要的数据。

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

谢谢!!

下面的一些答案很有意思-特别是建议强制C用户订阅和取消订阅。这很困难,因为:

C只是接口I的一种可能实现(没有此订阅要求),这是用户真正使用的接口。 C实现是在运行时注入的,因此我们不能强迫用户遵守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();
}

10-08 17:15