【问题标题】:Does setting variable to null clear just the reference? [duplicate]将变量设置为 null 是否仅清除引用? [复制]
【发布时间】:2015-10-30 17:26:26
【问题描述】:

如果我这样做会发生什么:

Object obj = new Object();
obj = null;

它是从内存中删除对象,还是只清除引用?

更正式地说,考虑代码:

Object obj = new Object();
Object temp = obj;
obj = null;

为什么temp 仍然不是null?它不应该从内存中删除吗?

【问题讨论】:

  • 简答:objtemp 不是对象。它们是可能指向对象的引用。

标签: java reference null


【解决方案1】:

在你的第一个例子中:

             +------+
obj -------> |OBJECT|
             +------+

obj设置为null后:

             +------+
obj          |OBJECT|
             +------+

不存在对该对象的引用,因此它“不再存在”,因为它已变得无法访问。


在你的第二个例子中:

obj -------> +------+
             |OBJECT|
temp ------> +------+

obj设置为null后:

obj          +------+
             |OBJECT|
temp ------> +------+

您可以看到 temp 仍然引用该对象,因此它仍然“存在”。

【讨论】:

    【解决方案2】:

    将对象设置为空,清除引用。如果不再有对该对象的任何引用,就像在您的第一个示例中一样,则可以在 JVM 下次运行 GC(垃圾收集器)时释放内存。

    只要仍然存在对该对象的引用(第二个示例),就不会发生这种情况。

    此外,通过 GC 释放内存和将内存返回给 OS 是有区别的,因此它可以被重用。通常,JVM 会保留一次分配的内存,直到 JVM 存在或 OS 耗尽可用内存为止。

    【讨论】:

      【解决方案3】:
      Object obj = new Object();
      obj = null;
      

      上面:它只是删除引用,不删除对象。但是,GC 会从内存中清除该对象,因为没有其他对该对象的引用。

      在此:

      Object obj = new Object();
      Object temp = obj;
      obj = null;
      

      temp 仍然是对 object 的引用,因此 object 保留在内存中。

      【讨论】:

        【解决方案4】:

        Java 与垃圾收集一起工作。所以你永远不会知道什么时候一个对象会从内存中删除。当你删除一个对象的最后一个引用时,它会被传递给垃圾收集器,垃圾收集器有时会删除该对象。

        在第二个示例中,您创建一个对象并提供对 obj 的引用。然后你通过 temp 引用 obj。现在您有 2 个对您的对象的引用。对象和温度。当您现在删除引用 obj 时,该对象仍被 temp 引用,因此不会将其交给垃圾收集器。

        【讨论】:

          【解决方案5】:

          在您的第一个示例中,obj 立即有资格进行垃圾收集。它尚未从内存中删除,尝试使用该引用将导致 NullPointerException

          在您的第二个示例中,分配给temp creates a copy of the reference originally referred to by obj。将 obj 设置为 null 不会使对象符合垃圾回收条件,因此它仍然存在。

          【讨论】:

            【解决方案6】:

            不,这不会从内存中删除,只是引用已设置为空。在 java GC(垃圾收集器)中,只有在需要更多内存或例行检查时才会在特定持续时间运行。在此之前,该对象仍保留在 HEAP 内存中。

            由于 JAVA 没有指针和析构函数,HEAP 存储完全由 GC 维护。

            【讨论】:

              【解决方案7】:

              两段代码的行为不同。

              在前者中,new Object() 创建的对象引用将符合 GC 条件。在后者中,new Object() 创建的对象引用将不符合 GC 条件,因为它仍然被 temp 引用。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-11-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-04-27
                • 1970-01-01
                • 2016-01-13
                • 2014-04-11
                相关资源
                最近更新 更多