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

标签 java android reference

关于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/

相关文章:

java - 在 Struts 2 中使用 ModelDriven 的多个不同的 POJO

c# - 在 .Net Core 中引用另一个项目

java - java 中 Kotlin 中 <?,?> 的等价物是什么?

android.support.v4.app.FragmentTabHost 无法转换为 android.widget.LinearLayout

java - onActivityResult总是返回未授权

android - Retrofit 2 如何从嵌套的 json 对象获取响应 (android)

javascript - 获取对 JavaScript 属性的直接引用

c++ - 为什么我们两次使用引用运算符?

java - java程序如何自动跟随303 http状态码响应中的重定向

java - 从/src/main/resources 读取文件出现异常 FileNotFound