gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:16:10 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com