gpt4 book ai didi

java - 在 Java 中使用哪种类型的引用?

转载 作者:行者123 更新时间:2023-11-29 05:09:11 24 4
gpt4 key购买 nike

关于WeakReferenceSoftReference等的使用,我这里准备了一些问题。但是,我仍然不清楚在下面的情况下我应该使用什么:

考虑一个名为 Manager 的主类。整个应用程序只有它的一个实例,它包含许多其他类(称它们为 WorkerAWorkerB...等等)作为成员:

public class Manager {
private final WorkerA wA;
private final WorkerB wB;
...
public Manager()
{
wA = new WorkerA(this);
...
}
}

因此 Manager 可以随时访问它的 Workers 并调用它们的方法。然而,有时甚至 worker 也必须与他们的经理沟通,所以他们都包含对经理的唯一实例的相同引用:

class WorkerA {
private final Manager mgr;

public WorkerA(Manager mgr)
{ this.mgr = mgr; }
}

Manager 的生命周期 = 应用程序的生命周期,它在开始时创建一次,在退出时处理。除了在管理器的构造函数中, worker 永远不会在其他任何地方实例化。

保存这些交叉引用的内存要求如何? (我的应用程序是一项应该运行很长时间的 Android 服务)。是否有具有相同功能的更好的解决方案?

最佳答案

持有对另一个对象的引用的字段指向的成本并不重要。

在 64 位 cpu 上,每个字段持有引用的成本将是 64 位,在 32 位 cpu 上或虚拟机使用压缩指针时更少。 GC 运行时也会有非常轻微的 CPU 成本。这是因为 GC 周期的成本与存在的 Activity 对象数量以及它们之间的链接有关。然而,当使用软/弱/虚引用时,内存使用和 cpu 的成本都会增加。这是因为它们需要比字段更大的额外对象分配,并且它们需要在 GC 循环期间进行特殊处理,这会消耗 CPU 时间。

使用特殊弱/软等引用的时间是当您打算在某个时候删除对象并且正常的 GC 生命周期不够时。由于您在应用的整个生命周期内保留对象,因此您的方法已经很合理了。

关于java - 在 Java 中使用哪种类型的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29281619/

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