我有一个数据生成器,它生成的数据供许多不同的消费者使用(我们称它们为 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/