我有一个数据生成器,该数据生成器生成供许多不同的使用者使用的数据(我们称其为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();
}