关于WeakReference
、SoftReference
等的使用,我这里准备了一些问题。但是,我仍然不清楚在下面的情况下我应该使用什么:
考虑一个名为 Manager
的主类。整个应用程序只有它的一个实例,它包含许多其他类(称它们为 WorkerA
、WorkerB
...等等)作为成员:
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/