【问题标题】:Android do i need to set each object to null when done using it?Android 完成使用后我需要将每个对象设置为 null 吗?
【发布时间】:2013-03-28 14:05:56
【问题描述】:

我创建了这个对象,其中包含对其他一些对象的引用:

public class ListHandler {

    private AppVariables app; //AppVariables instance
    private Extra extra; //the extra argument represanting the list
    private ArrayList<FacebookUser> arrayList; //the array list associate with the list given
    private Comparator<FacebookUser> comparator; //the comparator of the list
    private String emptyText; //list empty text

    /**
     * Constructor - initialize a new instance of the listHandler
     * @param app the current {@link AppVariables} instance
     * @param extra the {@link Extra} {@link Enum} of the list
     */
    public ListHandler(AppVariables app, Extra extra)
    {
        this.app = app;
        this.extra = extra;
         //set the array list to match the list given in the arguments
        setArrayList(); 
        setComparator();
        setEmptyTest();
    }
    /**
     * Clear all resources being held by this object
     */
    public void clearListHandler()
    {
        this.arrayList = null;
        this.comparator = null;
        this.app = null;
        this.emptyText = null;
        this.extra = null;      
    }   

我已经构建了clearListHandler() 方法,以便在使用完ListHandler 后将我正在使用的所有对象设置为null

有必要吗?我是否需要清除所有对象以便稍后将它们作为垃圾回收,或者 GC 是否会知道该对象不再使用,因为初始化它的对象不再使用?

【问题讨论】:

    标签: android memory-management garbage-collection


    【解决方案1】:

    垃圾收集非常聪明,您通常不需要将对象显式设置为 null(尽管在某些情况下使用位图会有所帮助)。

    如果一个对象不能从任何活动线程或任何静态引用访问,则该对象有资格进行垃圾收集或 GC,换句话说,如果一个对象的所有引用都为空,则可以说该对象有资格进行垃圾收集。循环依赖不计为引用,因此如果对象 A 具有对象 B 的引用并且对象 B 具有对象 A 的引用并且它们没有任何其他实时引用,那么对象 A 和 B 都将有资格进行垃圾收集。 通常,在以下情况下,对象可以在 Java 中进行垃圾回收:

    1. 该对象的所有引用显式设置为空,例如对象 = 空
    2. 对象是在块内创建的,一旦控制退出该块,引用就会超出范围。
    3. 父对象设置为 null,如果一个对象持有另一个对象的引用,并且当您将容器对象的引用设置为 null 时,子对象或包含的对象自动成为垃圾回收的条件。
    4. 如果一个对象只有通过 WeakHashMap 的实时引用,它将有资格进行垃圾回收。

    您可以在垃圾回收here找到更多详细信息。

    【讨论】:

      【解决方案2】:

      你不应该那样做。垃圾收集器将自动确定何时最好清除所有对象。 尝试阅读thisthis

      【讨论】:

      • 甲骨文与安卓无关。这是Dalvik
      • 但 Android 仍然是 Java,Dalvik 只是另一个 JVM。这些链接解释了任何 VM/JVM 通用的 GC 基础知识。
      • ~"垃圾收集器会自动判断"。从什么时候开始垃圾收集器是可预测和可靠的?尤其是在 Android 上...
      【解决方案3】:

      没有。 Dalvik/Java 虚拟机将分配内存,并根据需要取消分配内存。

      你所做的没有问题,只是没必要。

      【讨论】:

        猜你喜欢
        • 2016-07-28
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        • 2020-09-23
        • 1970-01-01
        • 2010-09-05
        • 2022-01-21
        相关资源
        最近更新 更多